Поделиться через


Принятие подключения (Windows Sockets API версия 2)

Как только сокет переходит в режим ожидания подключения, программа должна обрабатывать запросы на подключение через этот сокет.

Принятие подключения к сокету

  1. Создайте временный объект SOCKET с именем ClientSocket для приема подключений от клиентов.

    
    SOCKET ClientSocket;
    
    
    
  2. Как правило, серверное приложение будет предназначено для прослушивания подключений от нескольких клиентов. Для высокопроизводительных серверов часто используются несколько потоков для обработки нескольких клиентских подключений.

    Существует несколько различных методов программирования с помощью Winsock, которые можно использовать для прослушивания нескольких клиентских подключений. Один из методов программирования — это создание непрерывного цикла, который проверяет запросы на подключение с помощью функции listen (см. раздел Прослушивание сокета). Если возникает запрос на подключение, приложение вызывает принимать, AcceptExили функцию WSAAccept и передает работу другому потоку для обработки запроса. Возможны несколько других методов программирования.

    Обратите внимание, что этот базовый пример очень прост и не использует несколько потоков. В примере также прослушивается и принимается только одно подключение.

    
    ClientSocket = INVALID_SOCKET;
    
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    
    
  3. Когда подключение клиента принято, серверное приложение обычно передает принятый сокет клиента (переменную ClientSocket в приведенном выше примере кода) рабочему потоку или порту завершения ввода-вывода и продолжает принимать дополнительные подключения. В этом базовом примере сервер продолжает переходить к следующему шагу.

    Существует ряд других методов программирования, которые можно использовать для прослушивания и приема нескольких подключений. К ним относятся использование функций select или WSAPoll. Примеры некоторых из этих различных методов программирования показаны в расширенных примерах Winsock включенных в пакет средств разработки программного обеспечения Microsoft Windows (SDK).

    Заметка

    В системах Unix распространенный способ программирования для серверов — это приложение для прослушивания подключений. Когда подключение было принято, родительский процесс вызывал функцию fork, чтобы создать новый дочерний процесс для обработки подключения клиента, наследуя сокет от родительского процесса. Этот метод программирования не поддерживается в Windows, так как функция fork не поддерживается. Этот метод также не подходит для высокопроизводительных серверов, так как ресурсы, необходимые для создания нового процесса, гораздо больше, чем те, которые необходимы для потока.

После вызова функции ListenSocket не нужен для данного примера. Функция closesocket вызывается для закрытия сокета.

    // No longer need server socket
    closesocket(ListenSocket);

Следующий шаг: получение и отправка данных на сервере

Основы работы с Winsock

Серверное приложение Winsock

прослушивание сокета