4

接続されたソケットを呼び出しgetpeername、接続されたピアの IPv6 アドレスを取得しました。ピアの IP アドレスが localhost かどうかを確認するにはどうすればよいですか?

編集:明確にするために、ループバックIPアドレスのように、具体的にはlocalhostを意味します。

4

3 に答える 3

3

これは、次のようstruct sockaddr_in6に取得された にピアがあると仮定して、着信接続が localhost であるかどうかを確認する方法だと思います。getpeername

    struct sockaddr_in6 peer;
    socklen_t len = sizeof(peer);
    getpeername( sock, (struct sockaddr *) &peer, &len); // todo: error check

そこからstruct sockaddr_in6、localhost アドレスを独自に入力し::1、メモリが等しいかどうかを比較できます。

    struct sockaddr_in6 localhost;
    memset(localhost.sin6_addr.s6_addr, 0, 16);
    localhost.sin6_addr.s6_addr[15] = 1;

    if( memcmp(peer.sin6_addr.s6_addr, localhost.sin6_addr.s6_addr, 16) == 0)
        printf("localhost!\n");

または、localhost アドレスに対応するバイト配列を作成できます。

    static const unsigned char localhost_bytes[] =
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };

    if( memcmp(peer.sin6_addr.s6_addr, localhost_bytes, 16) == 0)
        printf("localhost!\n");

そして、マッピングされた IPv4 localhost に注意して::ffff:127.0.0.1ください。それも確認しておく必要があるかもしれません。

    static const unsigned char mapped_ipv4_localhost[] =
        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0x7f, 0, 0, 1 };

    if( memcmp(peer.sin6_addr.s6_addr, mapped_ipv4_localhost, 16) == 0)
        printf("mapped IPv4 localhost!\n");
于 2010-05-19T18:04:09.283 に答える
3

ループバック アドレスを除外した後、現在アクティブな IP のローカル マシンのリストを取得し (マシンには、異なるネットワーク用に複数の IP が割り当てられている場合があります)、一致するものが見つかるまでそのリストをループします。そのリストを実際に取得する方法は、使用している OS によって異なります。OS にはそのための独自の API がある場合があります (たとえば、Windows には GetAdaptersInfo() および関連する関数があります)。

于 2010-05-19T02:25:13.283 に答える
3

IPv6 では、ループバック アドレスは::1.

バイナリ レベルでは、127 個の 0 の後に 1 個の 1 が続きます。

于 2010-05-18T23:42:16.513 に答える