共用方式為


建立用戶端的套接字

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

建立套接字

  1. 宣告包含 sockaddr 結構的 addrinfo 物件,並初始化這些值。 針對此應用程式,不會指定因特網位址系列,以便傳回 IPv6 或 IPv4 位址。 應用程式要求套接字類型為 TCP 通訊協定的數據流套接字。

    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
    
    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family   = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    
  2. 呼叫 getaddrinfo 函式,要求在命令行上傳遞之伺服器名稱的 IP 位址。 用戶端所要連線之伺服器上的 TCP 連接埠會在此範例中定義為 27015 DEFAULT_PORT。 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 變數。 針對此應用程式,請使用呼叫 getaddrinfo 後傳回的第一個 IP 位址,該位址符合在 建議 參數中指定的位址系列、套接字類型和協定。 在此範例中,已使用套接字類型的 SOCK_STREAM和 IPPROTO_TCP 通訊協定來指定 TCP 數據流套接字。 位址系列未指定(AF_UNSPEC),因此傳回的IP位址可以是伺服器的IPv6或IPv4位址。

    如果用戶端應用程式只想要使用 IPv6 或 IPv4 進行連線,則必須在 提示 參數中,將位址系列設定為 IPv6 的AF_INET6或 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。 如果先前程式代碼中的 語句是用來攔截建立套接字時可能發生的任何錯誤,則 WSAGetLastError 會傳回與上次發生的錯誤相關聯的錯誤號碼。

注意

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

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

WSACleanup 用來終止WS2_32 DLL 的使用。

下一個步驟:連線到套接字

開始使用 Winsock

初始化 Winsock

Winsock 用戶端應用程式