建立用戶端的通訊端
初始化之後,必須具現化 SOCKET 物件以供用戶端使用。
建立通訊端
宣告包含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;
呼叫 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; }
建立名為 ConnectSocket 的 SOCKET 物件。
SOCKET ConnectSocket = INVALID_SOCKET;
呼叫 通訊端 函式,並將其值傳回至 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);
檢查是否有錯誤,以確保通訊端是有效的通訊端。
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 的使用。
下一個步驟: 連線到通訊端
相關主題