winsock2 接受客户端而不调用接受函数

问题描述

我正在尝试 Microsoft 文档中的 winsock 示例,

客户端代码 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 函数但客户端仍然能够连接并且返回有效的套接字 fd。

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);
}

感谢任何帮助

解决方法

如果 listen() 返回成功,操作系统将在后台为您接受新连接请求,并将新连接放入内部队列,然后 accept() 将从中拉取。因此,即使服务器代码从不调用 accept(),只要队列未满,新连接仍会在后台接受。如果队列已满,后续对新连接的请求将失败,并显示 (WSA)ECONNREFUSED 错误。