簡體   English   中英

Recvfrom重新讀取舊數據

[英]Recvfrom re-reading old data

我正在使用Berkeley C套接字在C / C ++中編程一個實時網絡系統,該系統以基於刻度的間隔工作。 每次滴答,客戶端程序都會使用recvfrom()從套接字讀取數據。

問題在於,如果服務器未發送任何數據,則客戶端將讀取套接字上發送的最后一個數據。

例如客戶端(偽代碼)

while (true)
{
   if (time_to_update())
   {
      int n = recvfrom(data,...);
      printf("%s",data);
   }
}

和服務器:

int main()
{
   int m = recvfrom(data,...);
   int n = sendto(...,"hello");
}

然后客戶端將繼續打印“ hello”,而我只需要打印一次即可。

這與這個問題很相似, 從套接字上重新讀取數據即可 ,但是我不太清楚答案,而且似乎可以更普遍地解決問題。

我猜數據存儲在上網卡的緩沖區中,在這種情況下,讀取1次后是否有清除緩沖區的空間? 我想到的另一種方法是對數據包編號,並且僅讀取新數據包,但是所有類型都是有限的,因此我希望可以有一種更簡潔的方法。

我將如何做,以便客戶端僅讀取一次接收到的數據?

您是否正在檢查變量m的返回值? 它很可能返回零或-1(因此未讀取任何字節),並且您一遍又一遍地重新打印相同的data值,因為沒有任何修改。

printf("%s",data);

常見問題。 不測試錯誤; 不測試流的結尾; 不使用長度。 應該:

if (n < 0)
{
    perror("recv");  // or better
    break;
}
else if (n == 0)
    break; // peer has disconnected 
else
    printf("%.*s", n, data);

如果不檢查這些內容,則將永遠旋轉並在發生這些情況時打印垃圾。

我猜數據存儲在上網卡的緩沖區中

沒有。

在這種情況下,讀取1次后仍有清除緩沖區的空間

閱讀它會清除它。 您的問題出在其他地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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