接受網路連線 (Windows Sockets 2)
當套接字開始接收連線後,程式必須處理該套接字上的連線請求。
在套接字上接受連線
建立名為 ClientSocket 的暫存 SOCKET 物件,以接受來自客戶端的連線。
SOCKET ClientSocket;
一般而言,伺服器應用程式的設計目的是接聽來自多個客戶端的連線。 針對高效能伺服器,通常會使用多個線程來處理多個客戶端連線。
有數種不同的程式設計技術使用 Winsock,可用來接聽多個用戶端連線。 其中一種程式設計技術是建立持續迴圈,以使用 監聽 函式來檢查連線請求(請參閱 套接字監聽)。 如果發生連線要求,應用程式會呼叫 接受、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 完成埠,並繼續接受其他連線。 在此基本範例中,伺服器會繼續進行下一個步驟。
有一些其他程式設計技術可用來接聽和接受多個連線。 其中包括使用 選取 或 WSAPoll 函式。 其中一些各種程式設計技術的範例說明於 進階 Winsock 範例 隨附於 Microsoft Windows 軟體開發工具包 (SDK) 中。
注意
在 Unix 系統上,伺服器的常見程式設計技術是讓應用程式接聽連線。 接受連接時,父進程會呼叫 分叉 函式,以建立新的子進程來處理用戶端連線,並從父系繼承套接字 (socket)。 Windows 不支援此程式設計技術,因為不支援 分支 函式。 這項技術通常不適用於高效能伺服器,因為建立新進程所需的資源遠大於線程所需的資源。
呼叫 接受 函式之後,此範例就不再需要 ListenSocket
。 呼叫 closesocket 函式來關閉套接字。
// No longer need server socket
closesocket(ListenSocket);
下一個步驟:在伺服器上接收和傳送數據