簡體   English   中英

C ++套接字服務器架構

[英]C++ socket server architecture

我正在為我的實時游戲設計一個TCP套接字服務器,我已經采用了兩種方法來構建它。 他們來了:

  1. 我們開始兩個線程。 一個人在無限循環中偵聽新連接,並將新客戶端添加到數組中。 第二個順序掃描陣列中的所有客戶端套接字並從中讀取數據。

  2. 我們啟動一個線程,它在一個無限循環中偵聽新連接,然后為每個只從一個套接字讀取數據的客戶端啟動新線程。

我已經對大約100個客戶端進行了一些測試,我看不出兩種架構的性能差異。 所以,我想問你的意見,哪種方式更好。 謝謝!

這完全取決於你的游戲實際的實時性

在第一種方法中,您正在所有打開的套接字上實現事件的多路分解 - 並且可能使用select()poll()來阻止。 顯然,雖然您只能在被阻止的情況下收到事件通知,但如果在解除阻止時有多個事件被傳遞,您可以有效地序列化每個事件的處理。

在第二種方法中,您有可能並行處理事件(特別是在多處理器系統上),並且還可以使用線程優先級對連接進行優先級排序。 但是,這種方法使用更多內存,而調度線程比在第一種方法中迭代事件列表要昂貴得多。

您需要問自己的問題是:

  • 你真的需要並行處理事件嗎? (你打算在處理中序列化執行嗎?)
  • 每個事件的處理量是否明顯大於調度線程的成本?
  • 線程堆棧的內存消耗是否會限制可伸縮性?
  • 您的實時要求是否真的那么嚴格?

在我看來,這取決於你認為對你更容易的。

你用升力嗎? 如果是,您可以查看使用asio實現此類服務器體系結構的示例。 這樣,您可以在偵聽連接和處理請求時避免手動管理線程。

ZeroMQ也是一個庫,專門用於輕松實現服務器架構。 有了它,您可以通過顯式控制線程數等來測試更詳細的案例。

希望這可以幫助。

如果你想去WebSocket,這里有一個快速提示:查看https://github.com/zaphoyd/websocketpp和/或詢問作者(Peter)。 WebSocket ++有一個非常靈活的框架,關於你的WebSocket處理的內容和方式。

根據經驗,我將為新客戶提供一個單獨的線程,以便您可以處理登錄,並讓它等待加入游戲的好點。 我想你並不總是想要讓新玩家登錄游戲中斷游戲。一個主線程可能會變得非常混亂。

您可能還希望線程組中的多個現有游戲線程具有可伸縮性,例如,如果您有8個以上的核心可用,則每個游戲一個。 考慮甚至從新游戲線程重定向到另一台服務器,以獲得更大的可擴展性。

只需使用Boost.Asio即可開心! 學習一些示例並開始制作實際游戲,而不是網絡基礎知識。

暫無
暫無

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

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