gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:08:56 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com