共用方式為


接受網路連線 (Windows Sockets 2)

當套接字開始接收連線後,程式必須處理該套接字上的連線請求。

在套接字上接受連線

  1. 建立名為 ClientSocket 的暫存 SOCKET 物件,以接受來自客戶端的連線。

    
    SOCKET ClientSocket;
    
    
    
  2. 一般而言,伺服器應用程式的設計目的是接聽來自多個客戶端的連線。 針對高效能伺服器,通常會使用多個線程來處理多個客戶端連線。

    有數種不同的程式設計技術使用 Winsock,可用來接聽多個用戶端連線。 其中一種程式設計技術是建立持續迴圈,以使用 監聽 函式來檢查連線請求(請參閱 套接字監聽)。 如果發生連線要求,應用程式會呼叫 接受AcceptExWSAAccept 函式,並將工作傳遞給另一個線程來處理要求。 其他數種程式設計技術是可行的。

    請注意,這個基本範例非常簡單,而且不會使用多個線程。 此範例也只會接聽 並只接受單一連線。

    
    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;
    }
    
    
    
  3. 接受用戶端連線時,伺服器應用程式通常會將已接受的用戶端套接字(上述範例程序代碼中的 ClientSocket 變數)傳遞至背景工作線程或 I/O 完成埠,並繼續接受其他連線。 在此基本範例中,伺服器會繼續進行下一個步驟。

    有一些其他程式設計技術可用來接聽和接受多個連線。 其中包括使用 選取WSAPoll 函式。 其中一些各種程式設計技術的範例說明於 進階 Winsock 範例 隨附於 Microsoft Windows 軟體開發工具包 (SDK) 中。

    注意

    在 Unix 系統上,伺服器的常見程式設計技術是讓應用程式接聽連線。 接受連接時,父進程會呼叫 分叉 函式,以建立新的子進程來處理用戶端連線,並從父系繼承套接字 (socket)。 Windows 不支援此程式設計技術,因為不支援 分支 函式。 這項技術通常不適用於高效能伺服器,因為建立新進程所需的資源遠大於線程所需的資源。

呼叫 接受 函式之後,此範例就不再需要 ListenSocket。 呼叫 closesocket 函式來關閉套接字。

    // No longer need server socket
    closesocket(ListenSocket);

下一個步驟:在伺服器上接收和傳送數據

開始使用 Winsock

Winsock Server 應用程式

在套接字上接聽