初始化之後,必須具現化 SOCKET 物件,以供伺服器使用。
為伺服器建立Socket
getaddrinfo 函式可用來判斷 sockaddr 結構中的值:
- AF_INET 用來指定 IPv4 位址系列。
- SOCK_STREAM 用來指定數據流套接字。
- IPPROTO_TCP 用來指定 TCP 通訊協定 。
- AI_PASSIVE 參數表示呼叫者打算在呼叫 系結 函式時使用傳回的套接字地址的結構體。 當設定 AI_PASSIVE 旗標,並將 nodename 參數設定為 getaddrinfo 函式是 NULL 指標時,套接字地址結構的 IP 位址部分會設定為 IPv4 位址或 IPv6 位址 IN6ADDR_ANY_INITINADDR_ANY。
- 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位址,getaddrinfo 符合 提示 參數中指定的位址系列、套接字類型和通訊協定。 在此範例中,請求了一個用於 IPv4 的 TCP 連接流套接字,其中包括 IPv4 的位址系列、SOCK_STREAM 的套接字類型,以及 IPPROTO_TCP 的通訊協定。 因此會要求 ListenSocket 的 IPv4 位址。
如果伺服器應用程式想要在IPv6上接聽,則必須在 提示 參數中將位址系列設定為AF_INET6。 如果伺服器想要同時接聽 IPv6 和 IPv4,則必須建立兩個接聽套接字,一個用於 IPv6,另一個用於 IPv4。 這兩個插槽必須由應用程式分開處理。
Windows Vista 和更新版本提供建立單一 IPv6 套接字的功能,該套接字會置於雙堆棧模式,以接聽 IPv6 和 IPv4。 如需這項功能的詳細資訊,請參閱 Dual-Stack Sockets。
// 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; }
下一個步驟:綁定套接字
相關主題