Соединение сокетов обычно происходит несимметрично. Один из процессов
действует как сервер, а другой выполняет роль клиента. Сервер
связывает свой сокет с предварительно указанным путем или адресом.
После этого для сокетов вида 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 - в случае ошибки.