IPv6 支援
為了在 Windows XP Service Pack 1(SP1) 和 Windows Server 2003 上同時支援 IPv4 和 IPv6 上的 IPv4 和 IPv6,應用程式必須建立兩個套接字、一個套接字與 IPv4 搭配使用,以及一個套接字來搭配 IPv6 使用。 這兩個套接字必須由應用程式分開處理。
如果 Windows XP SP1 和 Windows Server 2003 上的 TCP/IP 服務提供者支援 IPv4 和 IPv6 尋址,它必須建立兩個不同的套接字,並分別接聽這些套接字:
- 一次用於 IPv4。
- 一次用於 IPv6 位址系列。
Windows Vista 和更新版本可讓您建立單一 IPv6 套接字,以處理 IPv6 和 IPv4 流量。 例如,會建立 IPv6 的 TCP 接聽套接字、放入雙堆棧模式,並系結至埠 5001。 這個雙堆棧套接字可以接受從連線到埠 5001 的 IPv6 TCP 用戶端,以及從連線到埠 5001 的 IPv4 TCP 用戶端進行連線。 這項功能可大幅簡化應用程式設計,並減少在兩個個別套接字上張貼作業所需的資源額外負荷。 不過,必須符合一些限制,才能使用雙堆疊套接字。 如需詳細資訊,請參閱 Dual-Stack Sockets。
WSAEnumProtocols 會針對每個支援的套接字類型傳回兩個 WSAPROTOCOL_INFO 結構(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW)。 iAddressFamily 必須設定為 IPv4 尋址的 AF_INET,以及 IPv6 尋址的AF_INET6。
下列結構會說明 IPv6 位址。
struct in_addr6 {
u_char s6_addr[16]; /* IPv6 address */
};
struct sockaddr_in6 {
short sin6_family; /* AF_INET6 */
u_short sin6_port; /* Transport level port number */
u_long sin6_flowinfo; /* IPv6 flow information */
struct in_addr6 sin6_addr; /* IPv6 address */
u_long sin6_scope_id; /* set of interfaces for a scope */
};
如果應用程式使用 Windows Sockets 1.1 函式並想要使用 IPv6 位址,它可能會繼續使用採用 sockaddr 結構的所有舊函式作為其中一個參數(系結、連接、sendto,以及 從重新解析 、 接受等等)。 唯一需要的變更是使用 sockaddr_in6,而不是使用 sockaddr_in。
不過,名稱解析函式(gethostbyname、gethostbyaddr等等)和地址轉換函式(inet_addr、inet_ntoa)無法重複使用,因為它們假設 IP 位址長度為 4 個字節。 想要執行 IPv6 位址名稱解析和地址轉換的應用程式必須使用 Windows Sockets 2 特定函式。 已引進許多新函式,讓 Windows Sockets 2 應用程式利用 IPv6,包括 getaddrinfo 和 getnameinfo 函式。
如需如何在應用程式中啟用 IPv6 功能的詳細資訊,請參閱 windows Sockets Applications IPv6 指南。