Соединение сокетов обычно происходит несимметрично. Один из процессов
действует как сервер, а другой процесс выполняет роль клиента. Сервер
связывает свой сокет с предварительно указанным путем или адресом.
После этого для сокетов вида SOCK_STREAM сервер вызывает
функцию listen(), которая определяет, сколько запросов на
соединение можно поставить в очередь. Клиент запрашивает соединение
с сокетом сервера вызовом connect(), а сокет принимает некоторое
соединение с помощью функции accept(). Синтаксис вызова listen()
следующий:
#include <sys/ types. h>
#include <sys/ socket. h>
int listen (int socket, int backlog );
Первый аргумент указывает сокет для прослушивания, второй аргумент
(backlog) - целое положительное число, определяющее, как
много запросов связи может быть принято на сокет одновременно. В большинстве
систем это значение должно быть не больше пяти. Заметим, что это число
не имеет отношения к числу соединений, которое может поддерживаться
сервером. Аргумент backlog имеет отношение только к числу
запросов на соединение, которые приходят одновременно. Число установленных
соединений может значительно превышать это число.
Функция accept() используется сервером для принятия соединения
с сокетом. При этом сокет в момент вызова функции должен уже иметь
очередь запросов, созданную вызовом listen(). Если сервер
устанавливает связь с клиентом, то функция accept() возвращает
новый сокет-дескриптор, через который и происходит общение клиента
с сервером. Пока устанавливается связь клиента с сервером, функция
accept() блокирует другие запросы связи с данным сервером,
а после установления связи "прослушивание" запросов
возобновляется.
#include <sys/ types. h>
#include <sys/ socket. h>
int accept( int socket, struct sockaddr *addr, int *addrlen );
Первый аргумент функции - дескриптор сокета, выделенного для принятия
запросов на соединение от клиентов. Второй аргумент - указатель на
адрес клиента (структура sockaddr) для соответствующего домена.
Третий аргумент - указатель на длину структуры адреса. Второй и третий
аргументы заполняются соответствующими значениями в момент установления
связи клиента с сервером и позволяют серверу точно определить, с каким
именно клиентом он общается. Если сервер не интересуется адресом клиента,
в качестве второго и третьего аргументов можно задать NULL.
Функция connect() используется процессом-клиентом для установления
связи с сервером.
#include <sys/ types. h>
#include <sys/ socket. h>
int connect( int socket, struct sockaddr *name, int namelength );
Первый аргумент - дескриптор сокета клиента. Второй аргумент - указатель
на адрес сервера (структура sockaddr) для соответствующего
пространства адресов. Третий аргумент - длина структуры адреса. Функция
возвращает 0, если вызов успешный, и -1 в случае ошибки.