Rob*_*obS 4 network-protocols ipv6
有很多关于IPv6以及即将从IPv4切换到IPv6的新闻.我对IPv6有一些了解,但我经常想知道IPv6对应用程序开发和设计有多大影响(特别是)?
是否有一些我们今天还没有提供的有形/众所周知的好处?
我知道Windows Vista和Server 2008支持开箱即用的IPv6,今天是否有人使用(或设计使用IPv6),如果是这样,有什么好处?我们是否应该在当前和未来的项目中考虑IPv6?
是否有任何关于IPv6感知应用程序的好例子?
我害怕,亚伦的回答几乎是不正确的.是的,UI更改是必要的,但使用传统套接字API的任何代码也可能需要进行大量更改才能支持IPv6.
大多数旧代码使用特定的"地址族"常量(AF_INET)和特定的数据结构(struct sockaddr_in).任何仍然使用它的代码实际上都停留在IPv4领域.
较新的代码应该使用现代API调用,例如getaddrinfo()能够为协议,地址族(即AF_INET6),地址等返回正确的值,无论远程主机是使用IPv4还是IPv6(或两者).
它有点冗长,但这是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 */
Run Code Online (Sandbox Code Playgroud)