簡體   English   中英

C ++ TCP服務器類設計

[英]C++ TCP server Class Design

我正在使用C ++(win32 / linux)開發TCP服務器,該服務器可以滿足多個客戶端的需求。該服務器用於視頻流傳輸。客戶端向服務器請求視頻,服務器從與攝像機連接的網關獲取視頻。 我被設計班困住了,我發現三個班

  1. 窺視
  2. 會議和
  3. ConnectionMgr。

因此,這里ConnectionMgr負責管理其他類。

我希望您對此有意見。

  1. 對等方和會話需要什么信息;
  2. 對等與會話之間的關系
  3. 這里需要對哪些信息進行建模。
  4. 如何做Session的維護者。
  5. 管理多個客戶端將需要Threads那些線程可能需要的信息。

請提供您的反饋,以便我可以升級我的設計。

從頭開始看問題空間:

  • 每個客戶端之間都有某種關聯狀態-您似乎在Peer和Session之間分配了這種狀態,如果它們的比例為1:1,我看不出任何真正的價值-可以從高級設計階段忽略這種瑣事。
    • “對等方和會話需要具備什么信息”:套接字描述符是唯一關鍵的事情,假設您只有一台攝像機並以相同的速度流向所有客戶端(套接字套接字由於阻塞而無法完成時丟失數據,原因是完整緩沖區),否則,緩沖區也...
  • 您有一個ConnectionMgr,很好-是的,它必須偵聽並接受服務器套接字上的客戶端,可能為每個客戶端啟動一個新線程或監視當前客戶端連接的集合並調度事件
  • 您需要對I / O和並發模型做出一些決策(例如選擇/輪詢/非阻塞,異步,阻塞,單線程,每個客戶端線程,線程池等)
    • 這顯然會影響您的設計:您應該確定需要-或選擇-支持...

為了體會這個問題的空間,我建議您創建一個非常簡單的客戶端/服務器程序-如果您熟悉並熟悉多線程,則可以使用線程,否則可以通過GCC libc TCP客戶端/服務器示例進行選擇()的解決方案(http://www.gnu.org/s/libc/manual/html_node/Server-Example.html#Server-Example)或嘗試使用boost :: asio或ACE或其他方法。 首先,只要使其工作即可,您就可以遠程登錄到服務器,並且在任何連接中鍵入的內容都會在所有連接上回顯。 那應該給您足夠的洞察力,以便開始提出更具體的問題。

就像@nabulke和@Jan Hudec在評論中指出的那樣, Boost.Asio是解決您的問題的很好的解決方案。 看一看非常簡單的示例“異步TCP Echo服務器” 它僅使用2個類: serversession 沒有session_manager 通過智能指針自動管理會話,這是非常方便和簡單的方法。

使用Boost.Asio,您可以使網絡部分保持簡單(並通過使用異步處理提高效率,幾乎達到最佳狀態)。 另外,添加幾行代碼后,您會收到多線程服務器,而沒有頭疼(我建議使用以下示例: “使用單個io_service和調用io_service :: run()的線程池的HTTP服務器。” ,只需忽略HTTP。東西。注意在connection類中使用boost::asio::io_service::strand

暫無
暫無

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

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