本文介紹 CAsyncSocket 類的用法。請注意,該類在非常低的級別上封裝 Windows Sockets API。 CAsyncSocket 適合那些對網絡通信細節很了解,但希望利用回調的便利通知網絡事件的程序員使用。基於該假定,本文僅提供基本說明。如果想利用 Windows Sockets 方便地處理 MFC 應用程序中的多個網絡協議,而又不想放棄靈活性,可以考慮使用 CAsyncSocket 。您可能也會感覺到,自己直接編寫通信程序要比使用 CSocket 類的通用替換模型效果更好。
“MFC 參考”中對 CAsyncSocket 進行了描述。Visual C++ 也提供了位於 Platform SDK 中的 Windows Sockets 規范。具體細節由您決定。Visual C++ 不提供 CAsyncSocket 的示例應用程序。
如果您對網絡通信不是很了解,希望獲得一個簡單的解決方案,請使用帶 CArchive 對象的 CSocket 類。有關更多信息,請參見 Windows Sockets:使用帶存檔的套接字。
本文包括:
使用 CAsyncSocket
套接字的創建遵循兩階段構造的 MFC 模式。
例如:
CAsyncSocket sock;sock.Create( ); // Use the default parameters
- 或 -
CAsyncSocket* pSocket = new CAsyncSocket;int nPort = 27;pSocket-> Create( nPort, SOCK_DGRAM );
上面的第一個構造函數在堆棧上創建一個 CAsyncSocket 對象,第二個構造函數在堆上創建 CAsyncSocket 。上面的第一個 Create 調用使用默認參數創建流式套接字,第二個 Create 調用創建具有指定端口和地址的數據文報套接字。(任一個 Create 版本都可以和任一種構造方法一起使用。)
Create 的參數有:
對於服務器套接字,必須指定端口。對於客戶端套接字,通常接受此參數的默認值,該值允許 Windows Sockets 選擇端口。
該地址為網絡上的網際協議 (IP) 地址。很可能要始終依賴此參數的默認值。
關於術語“端口”和“套接字地址”的解釋見 Windows Sockets:端口和套接字地址。
- 或 -
如果套接字是服務器,則將套接字設置為開始偵聽(使用 CAsyncSocket::Listen)來自客戶端的連接嘗試。接收到連接請求時,用 CAsyncSocket::Accept 接受該請求。
接受連接後,可以執行驗證密碼等任務。
注意 Accept 成員函數采用對新的空 CSocket 對象的引用作為它的參數。在調用 Accept 之前,必須構造該對象。如果此套接字對象超出范圍,則連接關閉。不要對這個新套接字對象調用 Create 。有關示例,請參見文章 Windows Sockets:操作順序。
請參見“MFC 參考”中的 Windows Sockets 規范和 CAsyncSocket 類。
如果在堆棧上創建了套接字對象,當包含函數超出范圍時將調用此對象的析構函數。如果使用 new 運算符在堆上創建了套接字對象,則您必須負責使用 delete 運算符銷毀此對象。
析構函數在銷毀對象之前調用對象的 Close 成員函數。
有關代碼中該順序的示例(實際上是對於 CSocket 對象),請參見 Windows Sockets:操作順序。您對 CAsyncSocket 的責任
創建 CAsyncSocket 類的對象後,該對象封裝 Windows SOCKET 句柄並提供對此句柄的操作。使用 CAsyncSocket 時,如果您直接使用 API,則必須處理可能面對的所有問題。例如:
有關這些術語的定義和其他信息,請參見 Windows Sockets:阻塞、Windows Sockets:字節排序和 Windows Sockets:轉換字符串。
盡管存在這些問題,但如果應用程序需要您能獲得所有的靈活性和控制能力, CAsycnSocket 類可能是正確的選擇。如果應用程序沒有這種需求,可考慮使用 CSocket 類。 CSocket 向您隱藏大量詳細信息:它在阻塞調用期間抽取 Windows 消息並賦予您訪問 CArchive 的權限,而 CArchive 為您管理字節順序差異和字符串轉換。
有關更多信息,請參見:
Windows Sockets:背景知識
Windows Sockets:流式套接字
Windows Sockets:數據文報套接字