建立伺服器的通訊端

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

建立伺服器的通訊端

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

    • AF_INET 用來指定 IPv4 位址系列。
    • SOCK_STREAM 用來指定資料流程通訊端。
    • IPPROTO_TCP 用來指定 TCP 通訊協定 。
    • AI_PASSIVE 旗標表示呼叫端想要在系 函式的呼叫中使用傳回的通訊端位址結構。 當設定AI_PASSIVE旗標,而nodename參數設為getaddrinfo函式為Null指標時,通訊端位址結構的 IP 位址部分會設定為IPv4 位址的 INADDR_ANY,或 IPv6 位址的IN6ADDR_ANY_INIT
    • 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 位址,以 符合 hints 參數中指定的位址系列、通訊端類型和通訊協定。 在此範例中,IPv4 的 TCP 資料流程通訊端是透過 IPv4 的位址系列、SOCK_STREAM的通訊端類型,以及IPPROTO_TCP的通訊協定來要求。 因此會要求 ListenSocket 的 IPv4 位址。

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

    Windows Vista 和更新版本提供建立單一 IPv6 通訊端的能力,以在 IPv6 和 IPv4 上接聽雙堆疊模式。 如需此功能的詳細資訊,請參閱 雙重堆疊通訊端

    // 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 伺服器應用程式