共用方式為


Windows Sockets:搭配使用通訊端與封存

本文說明 CSocket 程式設計模型 。 類別 CSocket 提供比 CAsyncSocket 類別 更高的抽象層級通訊端支援。 CSocket 會使用 MFC 序列化通訊協定版本,透過 MFC CArchive 物件將資料傳入通訊端物件,以及從通訊端物件傳遞資料。 CSocket 會提供封鎖 (同時管理 Windows 訊息的背景處理),並且可讓您存取 CArchive,它可管理有關通訊的多個層面,否則您必須使用原始 API 或 CAsyncSocket 類別才能自行管理這些層面。

提示

您可以單獨使用 CSocket 類別做為更方便的 CAsyncSocket 版本,不過,最簡單的程式設計模型是使用 CSocket 搭配 CArchive 物件。

如需使用封存實作通訊端方式的詳細資訊,請參閱 Windows Sockets:Sockets with Archives Work 。 如需範例程式碼,請參閱 Windows 通訊端:作業 順序和 Windows 通訊端:使用封存 的通訊端範例。 如需從通訊端類別衍生自己的類別而獲得之某些功能的相關資訊,請參閱 Windows 通訊端:衍生自通訊端類別

注意

如果您要撰寫 MFC 用戶端程式與所建立的 (非 MFC) 伺服器進行通訊,請不要透過封存傳送 C++ 物件。 除非伺服器是 MFC 應用程式並且了解您想要傳送的物件種類,否則它將無法接收和還原序列化您的物件。 如需與非 MFC 應用程式通訊主題的相關資料,另請參閱 Windows 通訊端:位元組排序 一文

CSocket 程式設計模型

使用 CSocket 物件包含了建立數個 MFC 類別物件,並讓這些物件彼此相關聯。 在下面的一般程序中,每一個步驟都是由伺服器通訊端與用戶端通訊端所進行,除了步驟 3,該步驟中的每種通訊端類型需要一個不同的動作。

提示

在執行階段中,伺服器應用程式通常會先啟動並準備好,然後在用戶端應用程式尋找連接時「接聽」。 如果用戶端嘗試連接時伺服器尚未準備好,通常會需要使用者應用程式嘗試再次連接。

設定伺服器通訊端與用戶端通訊端之間的通訊

  1. 建構 CSocket 物件。

  2. 使用 物件來建立基礎 SOCKET 控制碼。

    CSocket針對用戶端物件,除非您需要資料包通訊端,否則您通常應該使用預設參數來 建立 CSocket針對伺服器物件,您必須在呼叫中 Create 指定埠。

    注意

    CArchive 無法搭配資料包通訊端使用。 如果您要對資料包通訊端使用 CSocket,則必須使用類別,就像使用 CAsyncSocket 一樣,也就是沒有封存。 由於資料包並不可靠 (不保證會達到,而且可能會重複或未依照順序),因此它們無法透過封存與序列化相容。 您會希望序列化作業能夠確實依序順利完成。 如果您嘗試對資料包使用 CSocket 搭配 CArchive 物件,MFC 判斷提示就會失敗。

  3. 如果通訊端是用戶端,請呼叫 CAsyncSocket::連線 ,將通訊端物件連接到伺服器通訊端。

    -或-

    如果通訊端是伺服器,請呼叫 CAsyncSocket::Listen 開始接聽 來自用戶端的連線嘗試。 收到連線要求後,請呼叫 CAsyncSocket::Accept 來接受它。

    注意

    成員 Accept 函式會採用對新的空白 CSocket 物件做為其參數的參考。 您必須先建構這個物件,才能呼叫 Accept 。 如果這個通訊端物件超出範圍,連接就會關閉。 請勿呼叫 Create 這個新的通訊端物件。

  4. 建立 CSocketFile 物件,將 CSocket 物件與其產生關聯。

  5. 建立 CArchive 物件以載入(接收)或儲存(傳送)資料。 封存會與 CSocketFile 物件相關聯。

    務必記住,CArchive 無法與資料包通訊端搭配使用。

  6. 請使用 CArchive 物件在用戶端和伺服器通訊端之間傳遞資料。

    請記住,一個特定 CArchive 物件只會朝某一方向移動資料:載入 (接收) 或儲存 (傳送)。 在某些情況下,您會使用兩個 CArchive 物件:一個用於傳送資料,另一個用於接收認可。

    在接受連接併設定封存之後,您就可以執行像是驗證密碼這類工作。

  7. 終結封存、通訊端檔案和通訊端物件。

    注意

    CArchive 類別明確提供了 IsBufferEmpty 成員函式搭配 CSocket 類別使用。 例如,如果緩衝區包含多個資料訊息,您就需要執行迴圈,直到所有訊息都已讀且緩衝區已清除。 否則,告知您有資料要接收的下一個通知可能會無限期延遲。 使用 IsBufferEmpty 可確保擷取所有資料。

Windows Sockets:作業 順序一文 說明此程式的兩端,以及範例程式碼。

如需詳細資訊,請參閱

另請參閱

MFC 中的 Windows Sockets
CSocket::Create