2015-09-02 160 views
0

我使用boost :: asio :: ip :: udp :: socket通過套接字的async_receive_from方法接收UDP數據包。Boost.ASIO UDP套接字:接收所有數據包

代碼工作正常,唯一的問題是,在我處理一個數據包的時候,更多的是創建一個隊列(緩衝區)來處理。我的程序雖然必須彙集自處理開始以來接收到的所有數據包,因此它只能偵聽最近的數據包。

實施例:

  • 分組1被髮送
  • 分組1正在處理
  • 包香菸2,3,4被髮送
  • 包1結束計算
  • 刷新緩衝區
  • 包5發送
  • 包5正在處理

有什麼辦法丟棄中間的包? 謝謝!

+0

在處理數據包之前,您必須存儲和定購數據包。例如,您可以將它們添加到列表中,然後從後面處理該列表。 – user743414

+0

感謝user743414。我目前通過緩衝區來完成。我不想要的是處理「舊」數據包,我只想處理儘可能多的數據包,丟棄中間的數據包。 – Jack

+0

定義「舊」數據包?你正在使用時間戳還是簡單的向上計數ID?當你只想處理最後一個數據包時,你只需要存儲最後收到的數據包。 – user743414

回答

1
  1. 使用僅保存單個數據報的緩衝區。

  2. 繼續讀入緩衝區,直到沒有更多的數據報要讀取。

  3. 如果您至少讀取一個數據包,請在緩衝區中處理數據報。

  4. 轉到步驟2。

注意,UDP是一個數據報協議,而不是一個數據包協議。單個UDP數據報可以分成多個數據包。

+0

謝謝大衛。不幸的是,數據報大小因命令而異,所以我無法制作大小適合的緩衝區。我可能做的是異步偵聽UDP數據報,解析接收到的字節(緩衝區足夠大以獲得更重的數據報),並最終同步接收,非阻塞,直到我沒有字節讀取了......這項工作? – Jack

+0

@Jack不要爲只有短時間內纔會發生的事情量身定製緩衝區。只需使用固定大小的緩衝區。如果稍後發生,您需要將對象保留更長時間,請將其複製到正確大小的緩衝區中。 –

+0

大衛你好。我想我誤解了你的第一個觀點:「使用只包含一個數據報的緩衝區」 - 你是什麼意思? – Jack

0

,我認爲這是可以做到很簡單:

  1. async_receive_from,直到有一個包。
  2. 檢查available確定套接字中有更多數據的方法。
  3. 如果我們有更多的數據,丟棄緩衝區並跳轉到1;其他進程數據包
+0

你好PSIAlt,謝謝你的回答。我看到了可用的方法,並且在考慮放棄緩衝區,但我無法做到。你怎麼丟棄緩衝區? – Jack

+0

@Jack它不可能,套接字API沒有這個功能。你只能讀取數據,什麼也不做。 – PSIAlt