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

UptoLike

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

- 51 -
closesocket(srv_socket);
MessageBox(NULL, "Ошибка функции WSAAsyncSelect",
"Error", MB_OK);
return;
}
В данном случае ожидание выполняется для сокета srv_socket. Послед-
ний параметр функции имеет параметр FD_ACCEPT, это означает, что при
попытке создания канала связи функция окна с дескриптором hWnd получит
сообщение WSA_ACCEPT, определенное в приложении.
Обработчик этого сообщения может выглядеть, например, следующим
образом
void
WndProc_OnWSAAccept(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
{
int rc;
// при ошибке отменяется поступление извещений
// в главное окно приложения
if (WSAGETSELECTERROR(lParam) != 0)
{
MessageBox(NULL, "Ошибка функции Accept", "Error", MB_OK);
WSAAsyncSelect(srv_socket, hWnd, 0, 0);
return;
}
// определение размера сокета
acc_sin_len = sizeof(acc_sin);
// разрешение установки соединения
srv_socket = accept(srv_socket, (LPSOCKADDR) & acc_sin,
(int FAR *) & acc_sin_len);
if (srv_socket == INVALID_SOCKET)
{
MessageBox(NULL, "Ошибка функции Accept, недопустимый сокет",
"Error", MB_OK);
return;
}
// если на данном сокете начнется передача данных от
// клиента, в главное окно приложения поступит
// сообщение WSA_NETEVENT.
// Это же сообщение поступит при разрыве соединения
                                      - 51 -


    closesocket(srv_socket);
    MessageBox(NULL, "Ошибка функции WSAAsyncSelect",
                      "Error", MB_OK);
    return;
}

    В данном случае ожидание выполняется для сокета srv_socket. Послед-
ний параметр функции имеет параметр FD_ACCEPT, это означает, что при
попытке создания канала связи функция окна с дескриптором hWnd получит
сообщение WSA_ACCEPT, определенное в приложении.
    Обработчик этого сообщения может выглядеть, например, следующим
образом

void
WndProc_OnWSAAccept(HWND hWnd,
                    UINT msg,
                    WPARAM wParam,
                    LPARAM lParam);
{
  int rc;

    // при ошибке отменяется поступление извещений
    // в главное окно приложения
    if (WSAGETSELECTERROR(lParam) != 0)
    {
        MessageBox(NULL, "Ошибка функции Accept", "Error", MB_OK);
        WSAAsyncSelect(srv_socket, hWnd, 0, 0);
        return;
    }

    // определение размера сокета
    acc_sin_len = sizeof(acc_sin);

    // разрешение установки соединения
    srv_socket = accept(srv_socket, (LPSOCKADDR) & acc_sin,
                       (int FAR *) & acc_sin_len);

    if (srv_socket == INVALID_SOCKET)
    {
        MessageBox(NULL, "Ошибка функции Accept, недопустимый сокет",
                          "Error", MB_OK);
        return;
    }

    // если на данном сокете начнется передача данных от
    // клиента, в главное окно приложения поступит
    // сообщение WSA_NETEVENT.
    // Это же сообщение поступит при разрыве соединения