Рассмотрим процедуру создания канала связи со стороны сервера.
Прежде всего вы должны переключить сокет в режим приема для выполнения ожидания соединения с клиентом при помощи функции 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.
| Код ошибки | Описание |
| WSANOTINITIALISED | Перед использованием функции необходимо вызвать функцию WSAStartup |
| WSAENETDOWN | Сбой в сети |
| WSAEFAULT | Значение параметра addrlen меньше размера структуры адреса |
| WSAEINTR | Работа функции была отменена при помощи функции WSACancelBlockingCall |
| WSAEINPROGRESS | Выполняется блокирующая функция интерфейса Windows Sockets |
| WSAEINVAL | Перед вызовом функции accept не была вызывана функция listen |
| WSAEMFILE | Нет доступных дескрипторов |
| WSAENOBUFS | Установлено слишком много соединений |
| WSAENOTSOCK | Указанный в параметре дескриптор не является сокетом |
| WSAEOPNOTSUPP | Данный тип сокета нельзя использовать при вызове функций, ориентированных на работу с каналом связи |
| WSAEWOULDBLOCK | Сокет отмечен как неблокирующий и в настоящее время нет каналов связи, которые нужно устанавливать |