问题描述
我正在尝试 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
错误。