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

Windows Sockets:使用 CAsyncSocket 類

編輯:關於C語言

本文介紹 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 對象。
  • 您具有的 CAsyncSocket 責任。
創建和使用 CAsyncSocket 對象

使用 CAsyncSocket

  1. 構造一個 CAsyncSocket 對象並使用該對象創建基礎 SOCKET 句柄。

    套接字的創建遵循兩階段構造的 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 選擇端口。

    • 套接字類型: SOCK_STREAM (默認值)或 SOCK_DGRAM
    • 套接字“地址”,如“ftp.microsoft.com”或“128.56.22.8”。

      該地址為網絡上的網際協議 (IP) 地址。很可能要始終依賴此參數的默認值。

    關於術語“端口”和“套接字地址”的解釋見 Windows Sockets:端口和套接字地址

  2. 如果套接字是客戶端,則使用 CAsyncSocket::Connect 將此套接字對象連接到服務器套接字。

    - 或 -

    如果套接字是服務器,則將套接字設置為開始偵聽(使用 CAsyncSocket::Listen)來自客戶端的連接嘗試。接收到連接請求時,用 CAsyncSocket::Accept 接受該請求。

    接受連接後,可以執行驗證密碼等任務。

    注意 Accept 成員函數采用對新的空 CSocket 對象的引用作為它的參數。在調用 Accept 之前,必須構造該對象。如果此套接字對象超出范圍,則連接關閉。不要對這個新套接字對象調用 Create 。有關示例,請參見文章 Windows Sockets:操作順序
  3. 通過調用 CAsyncSocket 對象的封裝 Windows Sockets API 函數的成員函數,與其他套接字進行通信。

    請參見“MFC 參考”中的 Windows Sockets 規范和 CAsyncSocket 類。

  4. 銷毀 CAsyncSocket 對象。

    如果在堆棧上創建了套接字對象,當包含函數超出范圍時將調用此對象的析構函數。如果使用 new 運算符在堆上創建了套接字對象,則您必須負責使用 delete 運算符銷毀此對象。

    析構函數在銷毀對象之前調用對象的 Close 成員函數。

有關代碼中該順序的示例(實際上是對於 CSocket 對象),請參見 Windows Sockets:操作順序。您對 CAsyncSocket 的責任

創建 CAsyncSocket 類的對象後,該對象封裝 Windows SOCKET 句柄並提供對此句柄的操作。使用 CAsyncSocket 時,如果您直接使用 API,則必須處理可能面對的所有問題。例如:

  • “阻塞”方案。
  • 發送和接收計算機之間的字節順序差異。
  • 在 Unicode 和多字節字符集 (MBCS) 字符串之間轉換。

有關這些術語的定義和其他信息,請參見 Windows Sockets:阻塞Windows Sockets:字節排序Windows Sockets:轉換字符串

盡管存在這些問題,但如果應用程序需要您能獲得所有的靈活性和控制能力, CAsycnSocket 類可能是正確的選擇。如果應用程序沒有這種需求,可考慮使用 CSocket 類。 CSocket 向您隱藏大量詳細信息:它在阻塞調用期間抽取 Windows 消息並賦予您訪問 CArchive 的權限,而 CArchive 為您管理字節順序差異和字符串轉換。

有關更多信息,請參見:

    Windows Sockets:背景知識

    Windows Sockets:流式套接字

    Windows Sockets:數據文報套接字

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