Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

10.4.1. Создание сокета

При любых моделях связи клиент и сервер должны создать абонентские точки (transport end points,), или сокеты, которые являются дескрипторами, используемыми для установки связи между процессами в сети. Они создаются при помощи системного вызова socket.

Описание

uses sockets;

Function Socket(Domain,SocketType,Protocol:Longint):Longint;

Параметр domain определяет коммуникационный домен, в котором будет использоваться сокет. Например, значение AF_INET определяет, что будет использоваться домен Internet. Интерес может представлять также другой домен, AF_UNIX, который используется, если процессы находятся на одном и том же компьютере.

Параметр SocketType определяет тип создаваемого сокета. Значение SOCK_STREAM указывается при создании сокета для работы в режиме виртуальных соединений, а значение SOCK_DGRAM – для работы в режиме пересылок дейтаграмм. Последний параметр protocol определяет используемый протокол. Этот параметр обычно задается равным нулю, при этом по умолчанию сокет типа SOCK_STREAM будет использовать протокол TCP, а сокет типа SOCK_DGRAM – протокол UDP. Оба данных протокола являются стандартными протоколами UNIX. Поэтому виртуальное соединение часто называют TCP-соединением, а пересылку дейтаграмм – работой с UDP-сокетами.

Системный вызов socket обычно возвращает неотрицательное целое число, которое является дескриптором файла сокета, что позволяет считать механизм сокетов разновидностью обобщенного файлового ввода/вывода UNIX.

10.5. Программирование в режиме tcp-соединения

Для того чтобы продемонстрировать основные системные вызовы для работы с сокетами, рассмотрим пример, в котором клиент посылает серверу поток строчных символов через TCP-соединение. Сервер преобразует строчные символы в прописные и посылает их обратно клиенту. В следующих разделах этой главы приведем тот же самый пример, но использующий сокеты UDP-протокола.

Сначала составим план реализации серверного процесса:

(* Серверный процесс *)

(* Включает нужные заголовочные файлы *)

uses sockets,stdio,linux;

var

sockfd:longint;

begin

(* Установить абонентскую точку сокета *)

sockfd := socket (AF_INET, SOCK_STREAM, 0);

if sockfd = -1 then

begin

perror ('Ошибка вызова socket');

halt (1);

end;

(* 'Связывание' адреса сервера с сокетом

Ожидание подключения

Цикл

установка соединения

создание дочернего процесса для работы с соединением

если это дочерний процесс,

то нужно в цикле принимать данные от клиента и посылать ему ответы

*)

end.

План клиентского процесса выглядит следующим образом:

(* Клиентский процесс *)

(* Включает нужные заголовочные файлы *)

var

sockfd:longint;

begin

(* Создает сокет *)

sockfd := socket (AF_INET, SOCK_STREAM, 0);

if sockfd = -1 then

begin

perror ('Ошибка вызова socket');

halt (1);

end;

(* Соединяет сокет с адресом серверного процесса *)

(* В цикле посылает данные серверу и принимает от него ответы *)

end.

Далее будем постепенно превращать эти шаблоны в настоящие программы, начиная с реализации сервера.

10.5.1. Связывание

Системный вызов bind связывает сетевой адрес компьютера с идентификатором сокета.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal