winsock2 принимает клиентов без вызова функции приема

Я пытаюсь использовать пример winsock из документов Microsoft,

клиентский код https://docs.microsoft.com/en-us/windows/win32/winsock/complete-client-code

код сервера https://docs.microsoft.com/en-us/windows/win32/winsock/complete-server-code

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

iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
    printf("listen failed with error: %d\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

while (1)
{
    Sleep(1000);
}

Любая помощь приветствуется


person malidu    schedule 08.06.2021    source источник


Ответы (1)


Если listen() возвращает успех, ОС будет принимать запросы на новые подключения для вас в фоновом режиме и помещать новые подключения во внутреннюю очередь, из которой accept() затем будет извлекать. Таким образом, даже если серверный код никогда не вызывает accept(), новые соединения все равно будут приниматься в фоновом режиме, пока очередь не заполнена. Если очередь заполняется, последующие запросы на новые подключения завершатся с ошибкой (WSA)ECONNREFUSED.

person Remy Lebeau    schedule 08.06.2021
comment
Привет, спасибо за ваш ответ, он действительно полезен, можно ли проверить, принимает ли сервер со стороны клиента или принимает соединения только с функцией accept()? - person malidu; 08.06.2021
comment
Невозможно отключить обработку очереди на стороне сервера, и самый близкий способ, которым клиент может узнать, действительно ли сервер принял соединение, — это если клиент действительно пытается связаться с сервером и проверяет, истекло ли время отклика. Очередь обрабатывает трехстороннее рукопожатие TCP, поэтому, насколько известно клиенту, она действительно подключена. Сервер просто еще не знает об этом, пока не вызовет accept(). - person Remy Lebeau; 08.06.2021