程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Windows Sockets:使用帶存檔的套接字

Windows Sockets:使用帶存檔的套接字

編輯:關於C語言

本文描述 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 除外,此步驟中每個套接字類型要求不同的操作)。

提示:在運行時,服務器應用程序通常首先做好准備然後“偵聽”客戶端應用程序何時尋求連接。如果客戶端嘗試連接時服務器未准備好,一般需要用戶應用程序稍後再嘗試連接。

設置服務器套接字和客戶端套接字之間的通信

  1. 構造一個 CSocket 對象。
  2. 使用此對象創建基礎 SOCKET 句柄。

    對於 CSocket 客戶端對象,除非需要數據文報套接字,否則通常應使用默認參數來 Create 該對象。對於 CSocket 服務器對象,則必須在 Create 調用中指定端口。

    注意:CArchive 不適用於數據文報套接字。如果想將 CSocket 用於數據文報套接字,必須像使用 CAsyncSocket 那樣使用該類,即不帶存檔。因為數據文報是不可靠的(不保證送達,並且可能重復或順序不對),它們不能通過存檔與序列化兼容。而您期望序列化操作可以可靠地、按順序完成。如果試圖將帶 CArchive 對象的 CSocket 用於數據文報,則 MFC 斷言失敗。
  3. 如果套接字是客戶端對象,則調用 CAsyncSocket::Connect 將此套接字對象連接到服務器套接字。

    - 或 -

    如果套接字是服務器端對象,則調用 CAsyncSocket::Listen 開始偵聽來自客戶端的連接嘗試。接收到連接請求時,調用 CAsyncSocket::Accept 接受該請求。

    注意:Accept 成員函數采用對新的空 CSocket 對象的引用作為它的參數。在調用 Accept 之前,必須構造該對象。如果此套接字對象超出范圍,則連接關閉。不要對這個新套接字對象調用 Create
  4. 創建一個 CSocketFile 對象,將 CSocket 對象與它關聯起來。
  5. 創建一個 CArchive 對象用於加載(接收)或存儲(發送)數據。此存檔與 CSocketFile 對象關聯。

    注意:CArchive 不適用於數據文報套接字。

  6. 使用 CArchive 對象在客戶端套接字與服務器套接字之間傳遞數據。

    注意,不管是加載(接收)還是存儲(發送),給定的 CArchive 對象只在一個方向上移動數據。某些情況下,需要使用兩個 CArchive 對象:一個用於發送數據,一個用於接收確認。

    接受連接並設置存檔後,可以執行驗證密碼之類的任務。

  7. 銷毀存檔、套接字文件和套接字對象。
    注意CArchive 類提供了專門與 CSocket 類一起使用的 IsBufferEmpty 成員函數。例如,如果緩沖區包含多條數據消息,則需要一直循環到讀完所有消息和清空緩沖區。否則,下一個指示有數據要接收的通知可能會無限期延遲。使用 IsBufferEmpty 可確保檢索所有數據。有關使用 IsBufferEmpty 的示例,請參見 CHATSRVR 示例應用程序。有關 MFC 示例的源代碼和信息,請參見 MFC 示例。

Windows Sockets:操作順序一文用示例代碼闡釋了此進程的兩端。

有關更多信息,請參見:

  • Windows Sockets:流式套接字
  • Windows Sockets:數據文報套接字

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved