9

この単純なクライアント/サーバー アプリケーションのペアがあります。コードは非常に単純です。私は 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;
}
4

3 に答える 3

8

で始まるアドレスff...はマルチキャストアドレスです。ストリームをマルチキャストアドレスに接続することはできません。

で始まるアドレスfe80...はリンクローカルアドレスであり、インターフェイス識別子が関連付けられています。sockaddrから戻ってきたものを見てみてくださいgetaddrinfoscopeフィールドは記入されていますか?

于 2012-09-04T10:01:25.567 に答える
8

IPv6 ping のインターフェイスを指定する必要があります (つまり、-I eth0)。

ping6 -I eth0 fe80::208:54ff:fe34:22ae

IPv6 ping にリンクローカル アドレスを使用するには、パケットを送受信する必要があるデバイスを定義する必要があります。各デバイスにはリンクローカル アドレスがあります。

これなしで試すと、次のようなエラー メッセージが表示されます。

--> # ping6 fe80::208:54ff:fe34:22ae 
connect: Invalid argument

この場合、次のようにインターフェイスを追加で指定する必要があります。

--> # ping6 -I eth0 fe80::208:54ff:fe34:22ae
PING fe80::208:54ff:fe34:22ae(fe80::208:54ff:fe34:22ae) from fe80::208:54ff:fe34:22ae eth0: 56 data bytes
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=0 ttl=64 time=0.027 ms
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from fe80::208:54ff:fe34:22ae: icmp_seq=2 ttl=64 time=0.036 ms

クライアントAPPで従わなければならない同様のアプローチの1つ..

于 2014-09-30T21:37:41.543 に答える
0

インターフェイス/ネットワーク接続で IP6 プロトコルをオンにすることをお勧めします。さらに、まだエラーが発生する場合は、ip4 プロトコルを破棄してください。

私の Linux ボックスでも、ip4-interface がアクティブで、アプリケーションが ip4-interface を ip6 設定で使用しようとしたときに、これが発生しました。同じことがウィンドウにも当てはまるはずです。

不明な点があれば質問してください。

于 2012-09-04T09:08:41.500 に答える