【发布时间】:2017-10-18 09:35:20
【问题描述】:
我有一个 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 字节)。
如何等待完整的消息(请记住消息长度是可变的)。
这甚至可能吗?也许有更好的方法。
提前致谢。
编辑:我应该澄清一下打印件仅用于测试。它们不会出现在最终结果中,因为从线程打印会产生奇怪的内联打印。
【问题讨论】:
-
你怎么知道你只有 8 个字节?您不评估收到的字节数。
-
断点 :) 都是在制品
-
如果发送更多字节,您不太可能只获得 8 个字节。
-
我的 char 数组填充在 recvfrom 之后的前 8 个元素中。收到的回复应该是消息+一个8字节长8字节,我的服务器也是打印出来的,根据传入的数据,长度一般是40+字节。
-
UDP 知道您发送了多少,并将其作为数据报发送,并作为数据报接收。您发送和接收的内容是 1::1,除非接收缓冲区太小,当然也禁止数据报丢失、重复和序列错误。这里没有任何相反的证据。
标签: c++ windows multithreading udp winsock