実際、IPv4 サーバー アプリケーションを Linux 上のデュアルスタック IPv4/IPv6 アプリケーションに移植しています。
私が使用して解決した基本的な機能:
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_addr = in6addr_any;
...
bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
...
listen(sock, 5);
...
newsock = accept(syn->sock, (struct sockaddr *) &cli_addr, &clilen);
IPv4 と IPv6 で接続でき、接続を使用できます。しかし、IPを取得したい場合:
switch(data->sa_family) {
case AF_INET:
inet_ntop(AF_INET, &(((struct sockaddr_in*)data)->sin_addr), buffer, size);
break;
case AF_INET6:
inet_ntop(AF_INET6, &(((struct sockaddr_in6*)data)->sin6_addr), buffer, size);
break;
default:
buffer[0] = '?';
buffer[1] = 0;
}
期待どおりに常にIPv6アドレスを取得します。または、IPv4接続の場合は::ffff:127.0.0.1のようなものです
127.0.0.1 (::ffff:-prefix なし) の形式でプレーンな古い IPv4 アドレスとして表示するには、何を変更する必要がありますか?
ありがとうテディ