关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
3年前关闭。
Improve this question
关于 IPv6 以及即将从 IPv4 切换到 IPv6 的报道很多。我对 IPv6 有一些了解,但我经常想知道 IPv6 对应用程序开发和设计(具体而言)有多大影响?
IPv6 是否提供了一些我们今天还没有的有形/众所周知的好处?
我知道 Windows Vista 和 Server 2008 支持开箱即用的 IPv6,现在有没有人在使用(或在设计时考虑到 IPv6),如果是,有什么好处?我们是否应该在当前和 future 的项目中考虑 IPv6?
是否有任何支持 IPv6 的应用程序的好例子?
最佳答案
恐怕亚伦的回答是非常不正确的。是的,UI 更改将是必要的,但任何使用传统套接字 API 的代码也可能需要进行大量更改以支持 IPv6。
大多数旧代码使用特定的“地址族”常量(AF_INET
)和特定的数据结构(struct sockaddr_in
)。任何仍在使用的代码实际上都停留在 IPv4 领域。
较新的代码应使用现代 API 调用,例如 getaddrinfo()
无论远程主机使用 IPv4 还是 IPv6(或两者),它都能返回协议(protocol)、地址族(即 AF_INET6
)、地址等的正确值。
有点长,但这里是来自 Linux 手册页的 getaddrinfo
的代码示例.请注意该调用如何获取潜在远程地址的完整列表,并依次尝试每个地址,直到成功:
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 */
关于network-protocols - IPv6 对应用程序开发和设计有什么好处/影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/207838/