我有一个非阻塞的 Winsock 套接字,它是 recv
'ing 循环中的数据。
我注意到,当使用 putty 和原始套接字连接时,发送消息工作得很好。但是,当与此特定客户端交互时,数据包似乎没有触发成功的、非 MSG_PEEK
调用recv
.我记得几年前遇到过类似的问题,最终不得不在 \r
中结束数据包。或来自客户端的东西,在这种情况下这是不可能的,因为我无法修改客户端。
Wireshark 显示通过的数据包很好;但是,我的服务器程序运行不正常。
我将如何解决这个问题?
编辑:例如,将缓冲区大小降低到 8 会导致在没有 MSG_PEEK 的情况下成功调用 recv。
接收调用:
iLen = recv(group->clpClients[cell]->_sock, // I normally call without MSG_PEEK
group->clpClients[cell]->_cBuff, CAPS_CLIENT_BUFFER_SIZE, MSG_PEEK);
if(iLen != SOCKET_ERROR)
{
...
套接字是
AF_INET
, SOCK_STREAM
和 IPPROTO_TCP
.
最佳答案
Microsoft 文档在几个地方指出 MSG_PEEK
应该完全避免,因为它效率低且不准确。使用select()
, WSAAsyncSelect()
, 或 WSASelectEvent()
而是检测套接字何时有数据可供读取,然后调用 recv()
至WSARecv()
真正阅读它。
关于c++ - 带有 MSG_PEEK 的 recv() 显示完整消息,但正常返回 'would block',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266783/