我有一个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字节)。
如何等待完整的消息(请记住消息长度是可变的)。
这甚至可能吗?也许有更好的方法。
提前致谢。
编辑:我应该澄清这些印刷品仅用于测试。它们不会出现在最终结果中,因为从线程打印会产生奇怪的内联打印。
答案 0 :(得分:0)
根据MSDN:
recvfrom函数接收数据报并存储源地址。
对于面向消息的套接字,数据从第一个排队的消息中提取,最大为指定缓冲区的大小。如果数据报或消息大于指定的缓冲区,则缓冲区将填充数据报的第一部分,recvfrom将生成错误WSAEMSGSIZE。对于不可靠的协议(例如,UDP),过多的数据会丢失。对于UDP,如果收到的数据包不包含数据(空),则recvfrom函数函数的返回值为零。
因此,您无法接收传入消息的一部分,只有当操作系统可以处理并返回已排队的数据报时,接收才会返回。
答案 1 :(得分:0)
为了完整性,任何遭受类似混淆的人发现这种情况的可能性很小,解决方案如下:
是的,这是一个愚蠢的问题,我应该已经意识到recvfrom等待完整的数据报。问题出在我的服务器上。
这是服务器不发送完整数据的问题。我不确定具体原因,但为了解决问题,我将char*
转换为char[]
我的回复被存储到(并正确打印)到justifyContent: 'space-between'
,当发送时,工作精细。