我正在使用UDP(以C語言)實現一個小型應用程序。服務器以給定數量的塊(例如100字節/呼叫)向給客戶機發送來自給定文件的數據。客戶端下載文件並將其保存在某個地方。問題在於客戶端可以接收一個參數,說明要讀取/調用多少個字節。
我的問題是當服務器發送100字節/通話,並且客戶端設置爲只讀15字節/通話。其他85個字節丟失,因爲消息從UDP隊列中刪除。UDP - 從隊列中讀取隊列中的數據
有沒有一種方法可以讀取這些消息塊,而不必將它們從隊列中刪除,直到它們被完全讀取?
我正在使用UDP(以C語言)實現一個小型應用程序。服務器以給定數量的塊(例如100字節/呼叫)向給客戶機發送來自給定文件的數據。客戶端下載文件並將其保存在某個地方。問題在於客戶端可以接收一個參數,說明要讀取/調用多少個字節。
我的問題是當服務器發送100字節/通話,並且客戶端設置爲只讀15字節/通話。其他85個字節丟失,因爲消息從UDP隊列中刪除。UDP - 從隊列中讀取隊列中的數據
有沒有一種方法可以讀取這些消息塊,而不必將它們從隊列中刪除,直到它們被完全讀取?
UDP不允許像TCP那樣分塊讀取。讀取UDP消息是一種全有或全無的操作,你可以全部讀取全部消息,也可以不讀取。中間沒有。因此,基於UDP的協議要麼使用固定大小的消息,要麼需要雙方動態協商消息大小(例如像TrivialFTP那樣)。
UDP協議沒有理由要求爲每條消息發送一個字節大小。消息大小本身隱含地決定了消息內部數據的大小。
如果您確實必須在實際閱讀郵件之前確定郵件大小,可以嘗試使用MSG_PEEK
標誌調用recvfrom()
,併爲其提供一個大的緩衝區以將數據複製到(至少64K,UDP郵件永遠不會超過,除非你使用IPv6 Jumbogram,但這是一個單獨的問題)。輸出將告訴您仍在隊列中的消息的實際大小。但是,如果你走這條路線,那麼你可以放棄MSG_PEEK
標誌,並總是使用64K緩衝區讀取,因此不會因緩衝區大小不足而丟失數據。
感謝您的回答。這是我在研究問題時得到的結論。 +1爲好解釋。 – 2013-03-16 08:36:29
您可以創建一個Thread來無限讀取UDP Buffer中的數據並將數據保存到一個圓形緩衝區。比客戶用你的速度消耗數據。如果緩衝區溢出,則無法執行任何操作。因爲服務器的發送速度比客戶端快。
更改您的客戶端服務器協議,以避免兩端互相混淆 – Vorsprung 2013-03-16 07:53:45
這將是偉大的,但我沒有創建協議。我必須爲我的計算機網絡課程和協議提供小應用程序。 – 2013-03-16 08:01:39
好的讓我換一種方式。 「當服務器發送100字節/呼叫時,客戶端設置爲只讀15字節/呼叫」您必須控制一端或另一端。只是不要設置客戶端和服務器讀取錯誤的字節數! – Vorsprung 2013-03-16 08:20:42