Установление связи
Со стороны клиента связь устанавливается с помощью стандартной функции
connect:
error = connect(s, serveraddr, serveraddrlen);
которая инициирует установление связи на сокете, используя дескриптор сокета s
и информацию из структуры serveraddr, имеющей тип sockaddr_in, которая
содержит адрес сервера и номер порта на который надо установить связь. Если
сокет не был связан с адресом, connect автоматически вызовет системную функцию
bind.
Connect возвращает 0, если вызов прошел успешно. Возвращенная величина -1
указывает на то, что в процессе установления связи произошла некая ошибка. В
случае успешного вызова функции процесс может работать с дескриптором сокета,
используя функции read и write, и закрывать канал используя функцию close.
Со стороны сервера процесс установления связи сложнее.
Когда сервер желает предложить один из своих сервисов, он связывает сокет с
общеизвестным адресом, ассоциирующимся с данным сервисом, и пассивно
слушает этот сокет. Для этих целей используется системный вызов listen:
error = listen(s, qlength);
где s это дескриптор сокета, а qlength это максимальное количество запросов на
установление связи, которые могут стоять в очереди, ожидая обработки сервером;
это количество может быть ограничено особенностями системы.
Когда сервер получает запрос от клиента и принимает решение об
установлении связи, он создает новый сокет и связывает его с ассоциацией,
эквивалентной 'слушающему сокету'. Для Internet домена это означает тот же
самый номер порта. Для этой цели используется системный вызов accept:
newsock = accept(s, clientaddr, clientaddrlen);
Сокет, ассоциированный клиентом, и сокет, который был возвращен
функцией accept, используются для установления связи между сервером и
клиентом.
Процесс установления связи показан на рисунке 1.
Рис. 1: Взаимодействие клиента и сервера