Глобальные сети компьютеров. Практическое введение в Internet


Сторона сервера


Рассмотрим процедуру создания канала связи со стороны сервера.

Прежде всего вы должны переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции listen:

int listen(SOCKET sock, int backlog);

Через параметр sock функции необходимо передать дескриптор сокета, который будет использован для создания канала. Параметр backlog задает максимальный размер очереди для ожидания соединения (можно указывать значения от 1 до 5). Очередь содержит запросы на установку соединений для каждой пары значений (адрес IP, порт).

Ниже мы привели список возможных кодов ошибок для функции listen.

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEADDRINUSE Указанный адрес уже используется
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEINVAL Сокет еще не был привязан к адресу или уже находится в подключенном состоянии
WSAEISCONN Сокет уже находится в подключенном состоянии
WSAEMFILE Недостаточно дескрипторов файлов
WSAENOBUFS Нет места для размещения буфера
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAEOPNOTSUPP Функция listen не работает с сокетом указанного типа

Ниже мы привели пример вызов функции listen:

if(listen(srv_socket , 1) == SOCKET_ERROR ) { closesocket (srv_socket); MessageBox(NULL, "listen Error", "Error", MB_OK); return; }

Далее необходимо выполнить ожидание соединения. Это можно выполнить двумя различными способами.

Первый способ заключается в циклическом вызове функции accept до тех пор, пока не будет установлено соединение. Затем можно будет приступать к обмену данными.

Функция accept имеет следующий прототип:

SOCKET accept (SOCKET sock, struct sockaddr FAR * addr, int FAR * addrlen);

Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания.

Параметр addr должен содержать адрес буфера, в который будет записан адрес узла, подключившегося к серверу. Размер этого буфера необходимо указать в переменной типа int, адрес которой передается через параметр addrlen.




Начало  Назад  Вперед



Книжный магазин