Windows上的非同步通訊程式庫CAsyncSocketEx
CAsyncSocketEx是一個叫Tim Kosse的2003年發布到codeproject.com上的一個小程式庫(http://www.codeproject.com/KB/IP/casyncsocketex.aspx),說是MFC的CAsyncSocket的替代品和改進品。
作為非同步通訊,CAsyncSocketEx這一套的模型,或者說執行模式,和原來MFC的CAsyncSocket類似,它們的非同步都不是自己另外實現的,核心是調用Windows提供的介面WSAAsyncSelect()。
WSAAsyncSelect(m_SocketData.hSocket,GetHelperWindowHandle(),m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY,
lEvent)
針對每個socket掉用WSAAsyncSelect(),之後一有這些socket的網路事件(比如收到網路資料,或是建立串連成功等),Windows會把socket的網路事件都投遞到線程的訊息佇列,從而達到非同步處理網路IO的目的。
它的大致架構如所示。
當線程建立第一個CAsyncSocketEx的時候,會執行個體化一個CAsyncSocketExHelperWindow。每個線程只有一個CAsyncSocketExHelperWindow。
列表m_spAsyncSocketExThreadDataList是靜態變數,記錄所有建立CAsyncSocketEx的線程的ID,HelperWindow和CAsyncSocketEx的個數。
因為是非同步,所以也適合單線程程式使用。你可以一個線程處理所有事情,而不需要獨立出一個獨立線程做網路IO。當然一個線程包攬所有事情在某些場合有它的固有缺點,這裡不詳述。
CAsyncSocketEx與MFC的CAsyncSocket的一個區別是,對網路事情的投遞做了改進。在一個CAsyncSocketExHelperWindow
(關聯一個線程)中,每一個socket(CAsyncSocketEx)都映射不同的訊息ID,這樣訊息到達視窗CAsyncSocketExHelperWindow的時候,直接以訊息ID為索引訪問數組,就直接得到對應的socket(CAsyncSocketEx),而不需要像MFC的CAsyncSocket那樣去尋找。
CAsyncSocketEx還引入層的概念,可以在CAsyncSocketEx中插入若干層(CAsyncSocketExLayer),而不改變CAsyncSocketEx對外的編程介面。發送資料的時候,資料從第一層CAsyncSocketExLayer穿過知道最後一層,再到windows的socket介面,接收資料的路徑則反過來,如。
有了這種靈活的層設計,CAsyncSocketEx程式庫順便把代理層也做了。你只要在程式中執行個體化一個CAsyncProxySocketLayer,並把它加到CAsyncSocketEx中就可以支援通過Proxy 伺服器串連了。支援SOCKS代理和HTTP代理。
CAsyncSocketEx電驢就有使用,關於它的實際應用,可以參考一下電驢的代碼。
-------------------------------------------------------------------------------------------------
更多博文請訂閱RSS,更多微博請關注@千裡孤行Nerd