[英]Recvfrom: wait for full message (variable size message, thread)
我有一個 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 字節)。
我如何等待完整的消息(記住消息長度是可變的)。
這甚至可能嗎? 也許有更好的方法。
提前致謝。
編輯:我應該澄清打印僅用於測試。 它們不會出現在最終結果中,因為從線程打印會產生奇怪的內聯打印。
根據MSDN :
recvfrom 函數接收數據報並存儲源地址。
對於面向消息的套接字,數據從第一個排隊的消息中提取,直到指定的緩沖區大小。 如果數據報或消息大於指定的緩沖區,緩沖區將填充數據報的第一部分,並且 recvfrom 生成錯誤 WSAEMSGSIZE。 對於不可靠的協議(例如 UDP),多余的數據會丟失。 對於 UDP,如果接收到的數據包不包含數據(空),則 recvfrom 函數的返回值為零。
因此,您無法接收傳入消息的一部分,只有當操作系統可以處理並返回入隊數據報時,接收才會返回。
為了完整起見,並且遇到類似混淆的人發現這一點的可能性很小,解決方案如下:
是的,這是一個愚蠢的問題,我應該意識到 recvfrom 等待一個完整的數據報。 問題出在我的服務器上。
這是服務器未發送完整數據的問題。 我不確定確切的原因,但為了解決這個問題,我將我的回復被存儲(並正確打印)的char*
轉換為char[]
,發送后工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.