回覆列表
  • 1 # 使用者5635123734932

      CAsyncSocket類逐個封裝了WinSock API,為高階網路程式設計師提供了更加有力而靈活的方法。這個類基於程式設計師瞭解網路通訊的假設,目的是為了在MFC中使用WinSock,程式設計師有責任處理諸如阻塞、位元組順序和在Unicode與MBCS 間轉換字元的任務。

      它是一個非同步非阻塞Socket封裝類,CAsyncSocket::Create()有一個引數指明瞭你想要處理哪些Socket事件,你關心的事件被指定以後,這個Socket預設就被用作了非同步方式。CAsyncSocket的Create()函式,除了建立了一個SOCKET以外,還建立了個CSocketWnd視窗物件,並使用WSAAsyncSelect()將這個SOCKET與該視窗物件關聯,以讓該視窗物件處理來自Socket的事件(訊息),然而CSocketWnd收到Socket事件之後,只是簡單地回撥CAsyncSocket::OnReceive()等虛擬函式。所以CAsyncSocket的派生類,只需要在這些虛函數里添加發送和接收的程式碼。

      CSocket類是由CAsyncSocket繼承而來的,事實上,在MFC中CAsyncSocket 逐個封裝了WinSock API,每個CAsyncSocket物件代表一個Windows Socket物件,使用CAsyncSocket 類要求程式設計師對網路程式設計較為熟悉。相比起來,CSocket類是CAsyncSocket的派生類,繼承了它封裝的WinSock API。

      CSocket是MFC在CAsyncSocket基礎上派生的一個同步阻塞Socket的封裝類,它的定義包含在

      其實很簡單,CSocket在Connect()返回WSAEWOULDBLOCK錯誤時,不是在OnConnect(),OnReceive()這些事件終端函數里去等待。你先必須明白Socket事件是如何到達這些事件函數里的。這些事件處理函式是CSocketWnd視窗物件回撥的,而視窗物件收到來自Socket的事件,又是靠執行緒訊息佇列分發過來的。總之,Socket事件首先是作為一個訊息發給CSocketWnd視窗物件,這個訊息肯定需要經過執行緒訊息佇列的分發,最終CSocketWnd視窗物件收到這些訊息就呼叫相應的回撥函式(OnConnect()等)。

      所以,CSocket在呼叫Connect()之後,如果返回一個WSAEWOULDBLOCK錯誤時,它馬上呼叫一個用於提取訊息的函式PumpMessage(...),就是從當前執行緒的訊息佇列裡取關心的訊息.

  • 中秋節和大豐收的關聯?
  • 葉門的和平曙光快到來了,真實的前景如何?