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 - в случае ошибки.



2004-06-22