Recvfrom:等待完整消息(可变大小消息,线程)

时间:2017-10-18 09:35:20

标签: c++ windows multithreading udp winsock

我有一个UDP客户端,它以指定的速率向服务器发送消息。速率需要保持不变,所以我决定尝试在单独的线程中接收回复,以避免阻止或延迟recvfrom()。收到之前是否可以“等待”完整的消息?这样做的最佳策略是什么?

while (true)
{
    //std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    if (recvfrom(threadSock, ReceiveBuf, BufLength, 0, 0, 0) == SOCKET_ERROR)
    {
        printf("Thread Receive failed with error %ld\n", GetLastError());
        break;
    }
    else
    {
        printf("Reply received: %s\n\n", ReceiveBuf);
    }
    memset(ReceiveBuf, '\0', BufLength);
}

以上是我的接收代码。目前,只有回复的前8个字符被读入缓冲区(缓冲区为512字节)。

如何等待完整的消息(请记住消息长度是可变的)。

这甚至可能吗?也许有更好的方法。

提前致谢。

编辑:我应该澄清这些印刷品仅用于测试。它们不会出现在最终结果中,因为从线程打印会产生奇怪的内联打印。

2 个答案:

答案 0 :(得分:0)

根据MSDN

  

recvfrom函数接收数据报并存储源地址。

     

对于面向消息的套接字,数据从第一个排队的消息中提取,最大为指定缓冲区的大小。如果数据报或消息大于指定的缓冲区,则缓冲区将填充数据报的第一部分,recvfrom将生成错误WSAEMSGSIZE。对于不可靠的协议(例如,UDP),过多的数据会丢失。对于UDP,如果收到的数据包不包含数据(空),则recvfrom函数函数的返回值为零。

因此,您无法接收传入消息的一部分,只有当操作系统可以处理并返回已排队的数据报时,接收才会返回。

答案 1 :(得分:0)

为了完整性,任何遭受类似混淆的人发现这种情况的可能性很小,解决方案如下:

是的,这是一个愚蠢的问题,我应该已经意识到recvfrom等待完整的数据报。问题出在我的服务器上。

这是服务器不发送完整数据的问题。我不确定具体原因,但为了解决问题,我将char*转换为char[]我的回复被存储到(并正确打印)到justifyContent: 'space-between',当发送时,工作精细。

相关问题