【问题标题】:winsock2 accepting clients without calling accept functionwinsock2 接受客户端而不调用接受函数
【发布时间】:2023-03-16 18:30:01
【问题描述】:

我正在尝试 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 函数但客户端仍然能够连接并且返回有效的套接字文件。

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

感谢任何帮助

【问题讨论】:

    标签: c++ c windows winapi winsock2


    【解决方案1】:

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

    【讨论】:

    • 嗨,感谢您的回答,它真的很有帮助,是否可以检查服务器是否从客户端接受或仅接受 accept() 函数的连接?
    • 没有办法在服务器端禁用队列处理,客户端可以知道服务器是否实际接受连接的最接近的方法是客户端是否真的尝试与服务器通信并检查如果响应超时。队列处理 3 次 TCP 握手,因此就客户端所知,它确实是连接的。服务器在调用accept() 之前还不知道这一点。
    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2014-04-07
    • 2012-11-16
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多