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