2008-12-06 76 views
0

我目前正在修改我們現有的專有套接字封裝代碼以使用boost asio,以便它可以爲我們完成一些繁重的工作。也許我們現有代碼中最複雜的部分是多播處理代碼。該代碼允許我們的中間層服務器(我可以在一個系統中使用多個服務器)將多播發送到客戶端框,客戶端框使用這些框向服務器用戶呈現更新。有沒有一種「很好」的方式來處理來自多個來源的重組多播?

代碼複雜且容易出錯的原因是它使用了大量的原始緩衝區來根據它們來自哪裏來重組組播流。看來即使有了Boost.Asio,我也不得不面對同樣的問題,所以在我陷入困境之前,我認爲值得詢問其他人是如何處理這種情況的。

這似乎是一個非常常見的用例。有沒有什麼可以幫助我完成這項工作,而不需要我現在擁有的代碼?還是有一個既定的C++模板(Boost或其他)可以完成這種工作?

很明顯,我可以讓自己更容易,並使用STL容器來緩衝數據包而不是原始數組,但是此代碼需要非常高的性能。在大型安裝中,有大量數據包在飛行,並且需要儘可能接近實時地進行響應。

在此先感謝您對此事的任何想法。

傑米

回答

2

它聽起來並不像你給予足夠的信息,詳細的解答,但也有一些普遍的指針要考慮組播數據的實時處理。

  • 如果您使用的是原始UDP組播,您可能在用戶空間中執行某種協議排序以處理丟失或重複的數據包。無論您想要做什麼優化,都會抵制誘惑來破壞應用程序和協議層之間的分層。
  • std::vector對於大多數用途而言,與原始動態分配字符緩衝區相同。不要因爲它是一個抽象層而回避使用它。有兩種情況下,你應該避免它,但是:
    • 如果你能逃脫靜態分配的緩存
    • 如果需要傳輸緩衝區的所有權下游(不過,如果你設計carefuly,swap()可能足夠)
  • 預分配是你的朋友。如果數據進入時可以使用一組緩衝區,則可以從快速執行路徑中刪除大部分動態分配。
  • 最小化內存拷貝。如果您可以在單個調用堆棧中處理數據,則有機會避免複製。如果您必須將數據傳遞到其他線程,則可能會被迫複製數據。
  • 如果您的應用程序可以處理分塊緩衝區(而不是將所有數據聚合到單個緩衝區中),請查看writevreadv

我不相信任何罐裝解決方案能解決您的問題。 Boost ASIO,libevent等都將爲您處理套接字抽象,但是一旦交付完成,對數據的處理仍然是您的責任。

相關問題