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

雖然架構看似複雜,但設計初衷是將套接字底層細節封裝:開發者僅需建立套接字、檔案、存檔物件,隨後透過插入 << 或提取 >> 運算子即可收發資料,所有緩衝管理、封包處理、同步切換均由框架自動處理。
CSocketFile 繼承自 CFile,但不支援 定位(Seek、GetLength、SetLength、GetPosition)、鎖定(LockRange、UnlockRange)等檔案專屬功能。這些成員在 CSocketFile 中被重寫為拋出 CNotSupportedException。其唯一任務:將位元組序列寫入或讀出關聯的 CSocket 物件。
CSocket 具備「異步」與「同步」兩種狀態:
此機制確保「通知中無通知」,避免在處理 OnReceive 時再次觸發 OnReceive 造成遞迴。範例程式碼:
void CMySocket::OnReceive() {
// ...
ar >> str; // 提取資料可能觸發同步操作
// ...
}
CSocketFile 建構函式的 bArchiveCompatible 參數預設為 TRUE,啟用「存檔相容模式」。此模式下:
若不使用 CArchive,可傳遞 FALSE 關閉相容模式,將 CSocketFile 作為有限功能的檔案物件使用。