建立伺服器的通訊端
初始化之後,必須具現化 SOCKET 物件,以供伺服器使用。
建立伺服器的通訊端
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; }
建立名為 ListenSocket 的 SOCKET 物件,讓伺服器接聽用戶端連線。
SOCKET ListenSocket = INVALID_SOCKET;
呼叫 通訊端 函式,並將其值傳回至 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);
檢查是否有錯誤,以確保通訊端是有效的通訊端。
if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
下一個步驟: 系結通訊端
相關主題