Программное обеспечение компьютерных сетей и информационных систем. Баканов В.М. - 50 стр.

UptoLike

Составители: 

- 50 -
Через параметр sock передается сокета, находящегося в режиме приема
для выполнения ожидания. Параметр addr должен содержать адрес буфера, в
который будет записан адрес узла, подключившегося к серверу (размер этого
буфера должен быть записан в целочисленной переменной, адрес которой
передается через параметр addrlen).
Список возможных кодов ошибки для функции accept приведен ниже
Код ошибки Описание
WSANOTINITIALISED
Перед использованием функции необходимо вызвать функ-
цию WSAStartup
WSAENETDOWN
Сбой в сети
WSAEFAULT Значение параметра addrlen меньше размера структуры ад-
реса
WSAEINTR
Выполнение функции было отменено при помощи функции
WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows
Sockets
WSAEINVAL Перед вызовом функции accept не была вызвана функция
listen
WSAEMFILE
Нет доступных дескрипторов
WSAENOBUFS
Установлено слишком много соединений
WSAENOTSOCK
Указанный в параметре дескриптор не является дескрипто-
ром сокета
WSAEOPNOTSUPP
Данный тип сокета нельзя использовать при вызове функ-
ций, ориентированных на работу с каналом связи
WSAEWOULDBLOCK
Сокет отмечен как неблокирующий и в настоящее время нет
каналов связи, которые нужно устанавливать
Второй (более удачный) способ ожидания соединения заключается в ис-
пользовании расширения программного интерфейса Windows Sockets, пред-
назначенного для выполнения асинхронных операций.
Вместо того, чтобы ожидать соединения, вызывая в цикле функцию
accept, приложение может единожды вызвать функцию WSAAsyncSelect,
указав ей, что при получении запроса на установку соединения оконная
функция приложения должна получить
сообщение
#define WSA_ACCEPT (WM_USER+1)
// При попытке установки соединения главное окно
// приложения получит сообщение WSA_ACCEPT
rc = WSAAsyncSelect(srv_socket, hWnd, WSA_ACCEPT,
FD_ACCEPT);
if (rc > 0)
{
                                    - 50 -


     Через параметр sock передается сокета, находящегося в режиме приема
для выполнения ожидания. Параметр addr должен содержать адрес буфера, в
который будет записан адрес узла, подключившегося к серверу (размер этого
буфера должен быть записан в целочисленной переменной, адрес которой
передается через параметр addrlen).
     Список возможных кодов ошибки для функции accept приведен ниже

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

    Второй (более удачный) способ ожидания соединения заключается в ис-
пользовании расширения программного интерфейса Windows Sockets, пред-
назначенного для выполнения асинхронных операций.
    Вместо того, чтобы ожидать соединения, вызывая в цикле функцию
accept, приложение может единожды вызвать функцию WSAAsyncSelect,
указав ей, что при получении запроса на установку соединения оконная
функция приложения должна получить сообщение

#define WSA_ACCEPT (WM_USER+1)

// При попытке установки соединения главное окно
// приложения получит сообщение WSA_ACCEPT

rc = WSAAsyncSelect(srv_socket, hWnd,                         WSA_ACCEPT,
                    FD_ACCEPT);

if (rc > 0)
{