恐怕亚伦的回答非常不正确。是的,UI 更改将是必要的,但任何使用传统套接字 API 的代码也可能需要进行大量更改以支持 IPv6。
大多数旧代码使用特定的“地址族”常量 (AF_INET) 和特定的数据结构 (struct sockaddr_in)。任何仍在使用的代码实际上都停留在 IPv4 领域。
较新的代码应该使用现代 API 调用,例如 getaddrinfo(),它能够为协议、地址族(即AF_INET6)、地址等返回正确的值,无论远程主机使用 IPv4 还是 IPv6 (或两者兼有)。
有点长,但这里有一个来自getaddrinfo 的 Linux 手册页的代码示例。请注意调用如何获取潜在远程地址的完整列表,并依次尝试每个地址,直到成功:
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
hints.ai_flags = 0;
hints.ai_protocol = 0; /* Any protocol */
s = getaddrinfo(hostname, service, &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
/* getaddrinfo() returns a list of address structures.
Try each address until we successfully connect(2).
If socket(2) (or connect(2)) fails, we (close the socket
and) try the next address. */
for (rp = result; rp != NULL; rp = rp->ai_next) {
sfd = socket(rp->ai_family, rp->ai_socktype,
rp->ai_protocol);
if (sfd == -1)
continue;
if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
break; /* Success */
close(sfd);
}
if (rp == NULL) { /* No address succeeded */
fprintf(stderr, "Could not connect\n");
exit(EXIT_FAILURE);
}
freeaddrinfo(result); /* No longer needed */