この単純なクライアント/サーバー アプリケーションのペアがあります。コードは非常に単純です。私は getaddinfo などの新しい推奨メソッドのみを使用しており、すべてが ipv4 で問題なく動作します。ipv6 ループバック (::1) でも機能します。他のIPv6アドレスに関しては問題が始まります...ネットワークに2台のマシンがあり、それらのipv4アドレスを渡すとすべて正常に動作しますが、クライアントにipv6アドレスを与えると、接続機能でエラーが発生します:無効な引数. ねえ、私はすでにこれを知っていますか?そうです!この ipv6 アドレスにping6を実行しようとすると、同じエラーが発生します。
connect: 引数が無効です
しかし、このブロックを克服する方法があります - -I スイッチを備えたインターフェイスを選択する必要があり、それ以降はすべてスムーズに実行されます。しかし、クライアント アプリで同じことを実現するにはどうすればよいでしょうか? 私は何をすべきか?私のクライアントコードは次のようになります。
struct addrinfo hints;
struct addrinfo *server;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
int status;
if((status = getaddrinfo(argv[1], argv[2], &hints, &server) != 0))
{
perror("getaddrinfo error");
return 1;
}
int sock_fd;
struct addrinfo *ptr;
for(ptr=server;ptr!=NULL;ptr=ptr->ai_next)
{
if( (sock_fd = socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol)) == -1)
{
perror("socket error");
continue;
}
if( connect(sock_fd, ptr->ai_addr,ptr->ai_addrlen) == -1 )
{
perror("connect error");
continue;
}
break;
}