c++ - 带有 MSG_PEEK 的 recv() 显示完整消息,但正常返回 'would block'

标签 c++ winsock recv peek

我有一个非阻塞的 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_STREAMIPPROTO_TCP .

最佳答案

Microsoft 文档在几个地方指出 MSG_PEEK应该完全避免,因为它效率低且不准确。使用select() , WSAAsyncSelect() , 或 WSASelectEvent()而是检测套接字何时有数据可供读取,然后调用 recv()WSARecv()真正阅读它。

关于c++ - 带有 MSG_PEEK 的 recv() 显示完整消息,但正常返回 'would block',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266783/

相关文章:

C++:传递给 C 运行时函数的参数无效

c++ - OpenCL/OpenGL 纹理互操作/windows 的问题

c++ - C++ 标准不允许 reinterpret_cast<int>( aFloatValue ) 的理由是什么?

c++ - 在 C++ 中的套接字上发送和接收数据

delphi - 如何快速接受 TCP 连接并同步我的 GUI?

c - 套接字选择不起作用

c++ - 为什么 std::operator>>(istream&, char&) 提取空格?

c++ - VisualC++ DLL 中的 OpenSSL

python - 需要深入了解 Python 的这段内容

html - 通过套接字下载 HTTP (C)