本文透過對照表的方式,詳細闡述建立伺服器與客戶端通信所需的流式套接字操作順序。由於範例使用 CArchive 物件,因此必須採用流式套接字進行通信。
在建構 CSocketFile 物件之前,下列操作順序對 CAsyncSocket 和 CSocket 均適用(僅少數參數不同)。自 CSocketFile 建構起,後續步驟則專用於 CSocket。下表說明客戶端與伺服器之間建立通信的完整步驟:
| 伺服器端 | 客戶端 |
|---|---|
// 建構套接字物件 CSocket sockSrvr; // 建立 SOCKET,指定連接埠 sockSrvr.Create(nPort); 1,2 // 開始監聽連線請求 sockSrvr.Listen(); // 建構新的空套接字物件 CSocket sockRecv; // 接受連線,將連接的 SOCKET 附加到 sockRecv sockSrvr.Accept(sockRecv); 5 // 建構檔案物件,關聯已連接的套接字 CSocketFile file(&sockRecv); // 建構存檔物件(讀取/寫入) CArchive arIn(&file, CArchive::load); // 或 CArchive arOut(&file, CArchive::store); // 或兩者皆建構 // 透過存檔傳遞資料 arIn >> dwValue; // 或 arOut << dwValue; 6 |
// 建構套接字物件 CSocket sockClient; // 建立 SOCKET,使用預設參數 sockClient.Create(); 2 // 尋求連線至伺服器 sockClient.Connect(strAddr, nPort); 3,4 // 建構檔案物件,關聯客戶端套接字 CSocketFile file(&sockClient); // 建構存檔物件(讀取/寫入) CArchive arIn(&file, CArchive::load); // 或 CArchive arOut(&file, CArchive::store); // 或兩者皆建構 // 透過存檔傳遞資料 arIn >> dwValue; // 或 arOut << dwValue; 6 |
資料報套接字屬無連線模式,不需 Connect、Listen、Accept 呼叫(但可選擇性使用 Connect)。若使用 CAsyncSocket,資料報通信改用 SendTo 和 ReceiveFrom;若已呼叫 Connect,則改用 Send 和 Receive。因 CArchive 不適用於資料報,切勿將帶存檔的 CSocket 用於資料報套接字。
CSocketFile 並不支援 CFile 的所有功能。定位功能(Seek、GetLength、SetLength、GetPosition)、鎖定功能(LockRange、UnlockRange)在套接字通信中無意義,因此被標記為不可用。嘗試使用 CEditView::SerializeRaw 透過附加於 CSocketFile 的 CArchive 序列化 CEditView 資料會失敗,因 SerializeRaw 預期檔案物件具備 Seek 等 CSocketFile 不支援的函式。正確做法是使用 CEditView::Serialize。
本文透過對照表詳細說明流式套接字在伺服器與客戶端之間建立通信的完整操作順序,涵蓋 CSocket/CSocketFile/CArchive 的建構、連線建立、資料傳輸及資源釋放流程,並釐清資料報套接字的差異與 CSocketFile 的功能限制。