CAsyncSocket異步機制

環境,而AfxSocketIn 一條訊息給CSocketWn d作為報告,CSocketWn

當你獲得了一個異步連線後,實際上你掃除了傳送動作與接收動作之
間的依賴性。所以你隨時可以發包,也隨時可能收到包。傳送、接收
函式都是異步非阻塞的,頃刻就能完成,所以收發交錯進行著,你可
以一直工作,保持很高的效率。
但是,正因為傳送、接收函式都是異步非阻塞的,所以僅調用它們並
不能保障傳送或接收的完成。
例如傳送函式Send,調用它可能有3種結果:錯誤、部分完成、全部完
成。其中錯誤又分兩種情況:一種是由各種網路問題導致的失敗,你
需要馬上決定是放棄本次操作,還是啟用某種對策;另一種是“忙”,
你實際上不用馬上理睬。你需要調用GetLastError來判斷是哪種情況,
GetLastError返回WSAEWOULDBLOCK,代表“忙”,為什麼當你Send得
到WSAEWOULDBLOCK卻不用理睬呢?因為CAsyncSocket會記得你的Send
WSAEWOULDBLOCK了,待傳送的數據會寫入CAsyncSocket內部的傳送緩
沖區,並會在不忙的時候自動調用OnSend,傳送內部緩衝區裡的數據。
同樣,如果Send只完成了一部分,你也不需要理睬,尚未傳送的數據
同樣會寫入CAsyncSocket內部的傳送緩衝區,並在適當的時候自動調
用OnSend完成傳送。
與OnSend協助Send完成工作一樣,OnRecieve、OnConnect、OnAccept
也會分別協助Recieve、Connect、Accept完成工作。這一切都通過消
息機制完成:
在你使用CAsyncSocket之前,必須調用AfxSocketInit初始化WinSock
環境,而AfxSocketInit會創建一個隱藏的CSocketWnd對象,由於這個
對象由CWnd派生,因此它能夠接收Windows訊息。一方面它會接受各個
CAsyncSocket的狀態報告,另一方面它能捕捉系統發出的各種SOCKET
事件。所以它能夠成為高層CAsyncSocket對象與WinSock底層之間的
橋樑:例如某CAsyncSocket在Send時WSAEWOULDBLOCK了,它就會傳送
一條訊息給CSocketWnd作為報告,CSocketWnd會維護一個報告登記表,
當它收到底層WinSock發出的空閒訊息時,就會檢索報告登記表,然後
直接調用報告者的OnSend函式。所以前文所說的CAsyncSocket會自動
調用OnXxx,實際上是不對的,真正的調用者是CSocketWnd——它是
一個CWnd對象,運行在獨立的執行緒中。

相關詞條

相關搜尋

熱門詞條

聯絡我們