next up previous contents
Next: Обмен данными через сокеты. Up: Сокеты. Previous: Создание и именование сокета.   Contents

Соединение сокетов.

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



2003-12-09