簡體   English   中英

Recvfrom:等待完整消息(可變大小消息,線程)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM