建立用戶端的通訊端

初始化之後,必須具現化 SOCKET 物件以供用戶端使用。

建立通訊端

  1. 宣告包含sockaddr結構的addrinfo物件,並初始化這些值。 針對此應用程式,網際網路位址系列未指定,因此可以傳回 IPv6 或 IPv4 位址。 應用程式要求通訊端類型成為 TCP 通訊協定的資料流程通訊端。

    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;
    
  2. 呼叫 getaddrinfo 函式,要求在命令列上傳遞之伺服器名稱的 IP 位址。 用戶端將連接的伺服器上的 TCP 埠是由此範例中的 DEFAULT_PORT 定義為 27015。 getaddrinfo函式會以檢查錯誤的整數傳回其值。

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. 建立名為 ConnectSocket 的 SOCKET 物件。

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. 呼叫 通訊端 函式,並將其值傳回至 ConnectSocket 變數。 針對此應用程式,請使用呼叫所傳回的第一個 IP 位址,以 符合 hints 參數中指定的位址系列、通訊端類型和通訊協定。 在此範例中,已指定 TCP 資料流程通訊端,其通訊端類型為 SOCK_STREAM,以及IPPROTO_TCP的通訊協定。 位址系列未指定 (AF_UNSPEC) ,因此傳回的 IP 位址可以是伺服器的 IPv6 或 IPv4 位址。

    如果用戶端應用程式只想要使用 IPv6 或 IPv4 進行連線,則必須將位址系列設定為 IPv6 的 AF_INET6,或在 hints 參數中設定為 IPv4 AF_INET。

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. 檢查是否有錯誤,以確保通訊端是有效的通訊端。

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

傳遞至 通訊端 函式的參數可以針對不同的實作進行變更。

錯誤偵測是成功網路程式碼的重要部分。 如果 通訊端 呼叫失敗,它會傳回INVALID_SOCKET。 先前程式碼中的 if 語句是用來攔截在建立通訊端時可能發生的任何錯誤。 WSAGetLastError 會傳回與上次發生錯誤相關聯的錯誤號碼。

注意

視應用程式而定,可能需要更廣泛的錯誤檢查。

例如,將 hints.ai_family 設定為 AF_UNSPEC 可能會導致連線呼叫失敗。 如果發生這種情況,請改用特定的 IPv4 (AF_INET) 或 IPv6 (AF_INET6) 值。

WSACleanup 可用來終止WS2_32 DLL 的使用。

下一個步驟: 連線到通訊端

使用 Winsock 消費者入門

初始化 Winsock

Winsock 用戶端應用程式