eq::net::Node中的數據發送、接收,都是由其中的成員對象_connect完成。該對象爲eq::net::Connection的對象指針,在win32下實例化爲socketConnectionWin32對象,它採用WinSock的overlapped模型進行數據的發送接收。其實質是以多線程形式的阻塞模式,實現數據的異步傳輸。同時,Connection類也提供了直接面對數據緩存與Packet結構體的傳輸接口,從而簡化了其在eq::net::Node中的應用。
在eq::net::Connection中,send/recv是高級接口,由應用對象,如eq::net::Node調用,而read/write是底層接口,用於直接處理數據傳輸的socket操作。高層接口內部通過底層接口執行網絡操作,其接口與底層操作無關,因此由eq::net::Connection類直接實現。而底層的read/write所使用的接口與運行的平臺相關,例如在windows中使用WinSock,在有的環境下會採取共享緩存方式,所以由不同的子類實現,如下圖。
3.消息響應
eq::net::Node在初始化監聽後會啓動兩個線程,分別用於接收監聽到的數據以及處理數據中的指令,所有的數據都以消息的形式進程處理。其中_receiverThread用於將接收到的消息放入node的消息隊列,而_commandThread則從消息隊列中依次獲取消息並根據消息執行操作。eq::Server在完成初始化後,會進入消息處理循環,不斷從消息隊列中獲得新的消息並進行處理。
eq::net::Node中利用eq::net::ConnectionSet實現異步的網絡通訊,並根據所接收到的消息進行簡單響應。需要注意的是,這裏通過異步接收到的消息並不是有效的應用消息。除了必要的異常消息外,Event_Data是其中最主要的消息,該消息中還包括收到該消息的connector,以及相應的數據大小。在_receiveThread線程中就是首先查詢eq::net::ConnectionSet,當出現Event_Data消息後,即根據該消息的參數進行同步的數據接收真正有效的消息數據。(這種方式下,首先通過簡單的異步消息避免了接收線程中不斷的主動查詢端口,然後只有在明確有有效數據到達時纔讀取端口,效率相對較高)