亚伦的回答是,恐怕是非常不正确的。是的,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 */
你的理解是不正确的。应用程序仍然必须能够创建套接字,地址结构等,所有这些都具有IPv6特定的变体。 – Alnitak 2008-12-18 15:40:36
不,我认为阿龙Axvig的总结是很公平的。大多数应用程序不应该直接操纵IP地址。套接字接口是一个非常低级的接口:它就像汇编语言。功能强大但非常不便。 – bortzmeyer 2009-01-01 17:54:00