本文描述 CSocket 編程模型。CSocket 類提供了比 CAsyncSocket 類抽象化級別更高的套接字支持。CSocket 使用 MFC 序列化協議的一種版本,通過 MFC CArchive 對象將數據傳遞給套接字對象,或者從套接字對象傳出數據。CSocket 提供阻塞(同時管理 Windows 消息的後台處理),並賦予您訪問 CArchive 的權限,而 CArchive 則管理著必須由您自己使用原始 API 或 CAsyncSocket 類來管理的通信的許多方面。
提示:可以單獨使用 CSocket 類作為 CAsyncSocket 的更方便版本,但最簡單的編程模型是使用帶 CArchive 對象的 CSocket。
有關帶存檔的套接字實現的工作機制的更多信息,請參見 Windows Sockets:帶存檔的套接字的工作方式。有關示例代碼,請參見 Windows Sockets:操作順序和 Windows Sockets:帶存檔的套接字示例。有關通過從套接字類派生自己的類獲得的某些功能的信息,請參見 Windows Sockets:從套接字類派生。
注意:如果正在編寫與已建立的(非 MFC)服務器通信的 MFC 客戶程序,則不要通過存檔發送 C++ 對象。除非該服務器是一個 MFC 應用程序,它知道您要發送的對象的類型,否則服務器將無法接收和反序列化這些對象。有關與非 MFC 應用程序通信的主題的相關材料,另請參見文章 Windows Sockets:字節排序。CSocket 編程模型
使用 CSocket 對象涉及創建數個 MFC 類對象並將它們關聯起來。在下面的一般過程中,服務器套接字和客戶端套接字都將采取每一步驟(步驟 3 除外,此步驟中每個套接字類型要求不同的操作)。
提示:在運行時,服務器應用程序通常首先做好准備然後“偵聽”客戶端應用程序何時尋求連接。如果客戶端嘗試連接時服務器未准備好,一般需要用戶應用程序稍後再嘗試連接。
設置服務器套接字和客戶端套接字之間的通信
對於 CSocket 客戶端對象,除非需要數據文報套接字,否則通常應使用默認參數來 Create 該對象。對於 CSocket 服務器對象,則必須在 Create 調用中指定端口。
注意:CArchive 不適用於數據文報套接字。如果想將 CSocket 用於數據文報套接字,必須像使用 CAsyncSocket 那樣使用該類,即不帶存檔。因為數據文報是不可靠的(不保證送達,並且可能重復或順序不對),它們不能通過存檔與序列化兼容。而您期望序列化操作可以可靠地、按順序完成。如果試圖將帶 CArchive 對象的 CSocket 用於數據文報,則 MFC 斷言失敗。
- 或 -
如果套接字是服務器端對象,則調用 CAsyncSocket::Listen 開始偵聽來自客戶端的連接嘗試。接收到連接請求時,調用 CAsyncSocket::Accept 接受該請求。
注意:Accept 成員函數采用對新的空 CSocket 對象的引用作為它的參數。在調用 Accept 之前,必須構造該對象。如果此套接字對象超出范圍,則連接關閉。不要對這個新套接字對象調用 Create。
注意:CArchive 不適用於數據文報套接字。
注意,不管是加載(接收)還是存儲(發送),給定的 CArchive 對象只在一個方向上移動數據。某些情況下,需要使用兩個 CArchive 對象:一個用於發送數據,一個用於接收確認。
接受連接並設置存檔後,可以執行驗證密碼之類的任務。
注意CArchive 類提供了專門與 CSocket 類一起使用的 IsBufferEmpty 成員函數。例如,如果緩沖區包含多條數據消息,則需要一直循環到讀完所有消息和清空緩沖區。否則,下一個指示有數據要接收的通知可能會無限期延遲。使用 IsBufferEmpty 可確保檢索所有數據。有關使用 IsBufferEmpty 的示例,請參見 CHATSRVR 示例應用程序。有關 MFC 示例的源代碼和信息,請參見 MFC 示例。
Windows Sockets:操作順序一文用示例代碼闡釋了此進程的兩端。
有關更多信息,請參見: