接受 Windows 通訊端 2 (連線)
通訊端接聽連線之後,程式必須處理該通訊端上的連線要求。
接受通訊端上的連線
建立稱為 ClientSocket 的暫存 SOCKET 物件,以接受來自用戶端的連線。
SOCKET ClientSocket;
一般而言,伺服器應用程式的設計目的是要接聽來自多個用戶端的連線。 針對高效能伺服器,通常會使用多個執行緒來處理多個用戶端連線。
有數種不同的程式設計技術使用 Winsock,可用來接聽多個用戶端連線。 一種程式設計技巧是建立連續迴圈,以使用 接聽 函式檢查連線要求, (請參閱在 通訊端) 上接聽 。 如果發生連線要求,應用程式會呼叫 accept、 AcceptEx或 WSAAccept 函式,並將工作傳遞給另一個執行緒來處理要求。 有數種其他程式設計技術。
請注意,這個基本範例非常簡單,而且不會使用多個執行緒。 此範例也會只接聽並只接受單一連線。
ClientSocket = INVALID_SOCKET; // Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("accept failed: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }
接受用戶端連線時,伺服器應用程式通常會將上述範例程式) 代碼中的 ClientSocket 變數 (接受的用戶端通訊端傳遞至背景工作執行緒或 I/O 完成埠,並繼續接受其他連線。 在此基本範例中,伺服器會繼續下一個步驟。
有一些其他程式設計技術可用來接聽和接受多個連線。 其中包括使用 select 或 WSAPoll 函式 。 Microsoft Windows 軟體發展工具組隨附的 進階 Winsock 範例 會說明其中一些各種程式設計技術的範例, (SDK) 。
注意
在 Unix 系統上,伺服器的常見程式設計技術是讓應用程式接聽連線。 接受連接時,父進程會呼叫 分支 函式,以建立新的子進程來處理用戶端連線,從父代繼承通訊端。 Windows 不支援此程式設計技術,因為不支援 分支 函式。 這項技術通常不適合高效能伺服器,因為建立新進程所需的資源遠大於執行緒所需的資源。
下一個步驟: 在伺服器上接收和傳送資料
相關主題