共用方式為


建立伺服器的插座

初始化之後,必須具現化 SOCKET 物件,以供伺服器使用。

為伺服器建立Socket

  1. getaddrinfo 函式可用來判斷 sockaddr 結構中的值:

    • AF_INET 用來指定 IPv4 位址系列。
    • SOCK_STREAM 用來指定數據流套接字。
    • IPPROTO_TCP 用來指定 TCP 通訊協定 。
    • AI_PASSIVE 參數表示呼叫者打算在呼叫 系結 函式時使用傳回的套接字地址的結構體。 當設定 AI_PASSIVE 旗標,並將 nodename 參數設定為 getaddrinfo 函式是 NULL 指標時,套接字地址結構的 IP 位址部分會設定為 IPv4 位址或 IPv6 位址 IN6ADDR_ANY_INITINADDR_ANY
    • 27015 是與客戶端將連線的伺服器相關聯的埠號碼。

    addrinfo 結構由 getaddrinfo 函式使用。

    #define DEFAULT_PORT "27015"
    
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    
    ZeroMemory(&hints, sizeof (hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  2. 建立名為 ListenSocket 的 SOCKET 物件,讓伺服器接聽用戶端連線。

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. 呼叫 套接字 函式,並將其值傳回至 ListenSocket 變數。 針對此伺服器應用程式,請使用呼叫所傳回的第一個IP位址,getaddrinfo 符合 提示 參數中指定的位址系列、套接字類型和通訊協定。 在此範例中,請求了一個用於 IPv4 的 TCP 連接流套接字,其中包括 IPv4 的位址系列、SOCK_STREAM 的套接字類型,以及 IPPROTO_TCP 的通訊協定。 因此會要求 ListenSocket 的 IPv4 位址。

    如果伺服器應用程式想要在IPv6上接聽,則必須在 提示 參數中將位址系列設定為AF_INET6。 如果伺服器想要同時接聽 IPv6 和 IPv4,則必須建立兩個接聽套接字,一個用於 IPv6,另一個用於 IPv4。 這兩個插槽必須由應用程式分開處理。

    Windows Vista 和更新版本提供建立單一 IPv6 套接字的功能,該套接字會置於雙堆棧模式,以接聽 IPv6 和 IPv4。 如需這項功能的詳細資訊,請參閱 Dual-Stack Sockets

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. 檢查是否有錯誤,以確保套接字是有效的套接字。

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

下一個步驟:綁定套接字

開始使用 Winsock

初始化 Winsock

Winsock 伺服器應用程式