整個底層通訊模組修改過很多次,因為首次使用epoll,在其中遇見了很多問題,最終設計成下面的方式:
1: 對於epoll中epollout事件的使用,因為頻繁的呼叫send()函式,系統會在核心模式和使用者模式之間切換太多消耗太大,所以最終啟用了定時器模式,比如以50ms為間隔,定時的遍歷所有的clientplayer 去傳送 outstream 裡面的資料。
2: 最開始使用玩家的id 對應每個玩家的clientplayer的,在玩家沒有進入的時候 使用玩家的賬號名; 後來增加了乙個map,用玩家id去對映對應的socket,在用socket 去對映對應的clientplayer。
3: 對於epoll中的epollout事件,因為啟用的是邊緣模式,所以在連線剛建立的時候會觸發這個事件,但是如果在之後再想通過這個時間的觸發去傳送資料就不可能了。所以盡量還是不要使用epollout事件去做傳送處理。
4: 每個連線都有自己的快取,當快取慢的時候就做異常處理,將這個客戶端斷開。
6: 訊息的接受和傳送做在了乙個執行緒裡,不同型別的訊息的處理坐在了不同的執行緒裡。兩者通過上篇講到的訊息佇列進行通訊。
客戶端與伺服器端通訊
關係圖 傳送 邏輯管理器 處理邏輯傳送指令 指令解析管理器 根據協議xml解析指令成二進位制資料 把二進位制資料傳給伺服器 接收 伺服器傳送二進位制資料到客戶端 指令解析管理器 根據協議xml解析二進位制資料 根據解析資料對映到邏輯類來處理 2 1 3 20 2,2 21 1,1,2 指令名和指令名...
C Socket TCP 客戶端,伺服器端通訊
客戶端與伺服器通訊,通過ip 識別主機 埠號 識別應用程式 埠號 可自行設定,但通常為4位。伺服器端 using system using system.collections.generic using system.linq using system.net using system.net.s...
伺服器和客戶端 tcp通訊
在vs2013的環境下,伺服器 如下 include include stdafx.h include pragma comment lib,ws2 32.lib using namespace std define buffer rev 1024 define buffer send 1024 i...