首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows Sockets:CSocket、CSocketFile 與 CArchive 協作機制深度解析

     編輯:關於C語言

本文深入解析 CSocket、CSocketFile、CArchive 三大核心類別如何協作,簡化 Windows 套接字的資料收發操作。前文 Windows Sockets:帶存檔套接字的資料序列化範例 介紹的 PacketSerialize 函式,其存檔物件運作機制與 MFC 標準 Serialize 函式極為相似,核心差異在於:套接字存檔不連結磁碟檔案,而是透過 CSocketFile 連結 CSocket 物件。

三層架構關係圖

雖然架構看似複雜,但設計初衷是將套接字底層細節封裝:開發者僅需建立套接字、檔案、存檔物件,隨後透過插入 << 或提取 >> 運算子即可收發資料,所有緩衝管理、封包處理、同步切換均由框架自動處理。

核心類別職責

CArchive:緩衝區管理者

  • 存儲模式(發送):緩衝區滿時,關聯的 CFile 寫出內容,相當於發送訊息。
  • 載入模式(接收):緩衝區滿時,CFile 暫停讀取直到緩衝區再度可用。
  • 呼叫 Flush() 可強制發送緩衝資料。

CSocketFile:套接字專用檔案介面

CSocketFile 繼承自 CFile,但不支援 定位(Seek、GetLength、SetLength、GetPosition)、鎖定(LockRange、UnlockRange)等檔案專屬功能。這些成員在 CSocketFile 中被重寫為拋出 CNotSupportedException。其唯一任務:將位元組序列寫入或讀出關聯的 CSocket 物件。

CSocket:雙狀態同步機制

CSocket 具備「異步」與「同步」兩種狀態:

  • 異步狀態(預設):可接收框架的非同步通知(如 OnReceive)。
  • 同步狀態:執行 Receive/Send 等操作時進入,阻塞後續同類通知,防止遞迴呼叫導致堆疊溢位。

此機制確保「通知中無通知」,避免在處理 OnReceive 時再次觸發 OnReceive 造成遞迴。範例程式碼:

void CMySocket::OnReceive() {
    // ...
    ar >> str;  // 提取資料可能觸發同步操作
    // ...
}

進階:存檔相容模式與死鎖預防

CSocketFile 建構函式的 bArchiveCompatible 參數預設為 TRUE,啟用「存檔相容模式」。此模式下:

  • 效能更佳,降低死鎖風險。
  • 死鎖成因:雙方套接字同時等待對方或共享資源。
  • CArchive 處理 CFile 時,收到位元組數少於請求視為檔案結尾(EOF);但 CSocketFile 以訊息為基礎,緩衝區可含多個訊息,位元組數較少不代表 EOF。
  • 應用程式不會阻塞,可持續讀取直到緩衝區為空。
  • 可使用 CArchive::IsBufferEmpty() 監控緩衝區狀態。

若不使用 CArchive,可傳遞 FALSE 關閉相容模式,將 CSocketFile 作為有限功能的檔案物件使用。

相關範例與參考

  • MFC 範例 CHATTER 與 CHATSRVR 示範此用法。
  • Windows Sockets:使用帶存檔的套接字
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved