[英]C++ socket server architecture
我正在為我的實時游戲設計一個TCP套接字服務器,我已經采用了兩種方法來構建它。 他們來了:
我們開始兩個線程。 一個人在無限循環中偵聽新連接,並將新客戶端添加到數組中。 第二個順序掃描陣列中的所有客戶端套接字並從中讀取數據。
我們啟動一個線程,它在一個無限循環中偵聽新連接,然后為每個只從一個套接字讀取數據的客戶端啟動新線程。
我已經對大約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.