Aaron の回答は、残念ながら、かなり間違っています。はい、UI の変更が必要になりますが、従来のソケット API を使用するコードも、IPv6 をサポートするために大幅な変更が必要になる可能性があります。
ほとんどの古いコードは、特定の「アドレス ファミリ」定数 ( AF_INET
) と特定のデータ構造 ( struct sockaddr_in
) を使用します。それをまだ使用しているコードは、実質的に IPv4 の土地に閉じ込められています。
新しいコードは、リモート ホストが IPv4 または IPv6 (またはその両方) を使用しているかどうかに関係なく、プロトコル、アドレス ファミリ (つまり )、アドレスなどgetaddrinfo()
の正しい値を返すことができる最新の API 呼び出しを使用する必要があります。AF_INET6
少し長くなりますが、Linux の man ページからのコード サンプルを次に示します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 */