CAsyncSocket異步機制

基本介紹

  • 中文名:CAsyncSocket異步機制
  • 類別:異步機制
  • 從屬:計算機軟體研究
  • 創建時間:20世紀
基本信息,其他信息,

基本信息

當你獲得了一個異步連線後,實際上你掃除了傳送動作與接收動作之間的依賴性。所以你隨時可以發包,也隨時可能收到包。傳送、接收函式都是異步非阻塞的,頃刻就能完成,所以收發交錯進行著,你可以一直工作,保持很高的效率。但是,正因為傳送、接收函式都是異步非阻塞的,所以僅調用它們並不能保障傳送或接收的完成。
例如傳送函式Send,調用它可能有3種結果:錯誤、部分完成、全部完成。其中錯誤又分兩種情況:一種是由各種網路問題導致的失敗,你需要馬上決定是放棄本次操作,還是啟用某種對策;另一種是“忙”,你實際上不用馬上理睬。你需要調用GetLastError來判斷是哪種情況,GetLastError返回WSAEWOULDBLOCK,代表“忙”,為什麼當你Send得到WSAEWOULDBLOCK卻不用理睬呢?因為CAsyncSocket會記得你的SendWSAEWOULDBLOCK了,待傳送的數據會寫入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對象,運行在獨立的執行緒中。

相關詞條

熱門詞條

聯絡我們