3

次のような小さなスニペットを使用して、特定のネットワークアドレスを探しています。

  char name[INET_ADDRSTRLEN];
  struct ifaddrs *iflist;
  if (getifaddrs(&iflist) < 0)
    perror("getifaddrs");

  struct in_addr addr;
  for (struct ifaddrs *p = iflist; p; p = p->ifa_next)
    {
      if (strcmp(p->ifa_name, "lo") == 0)
        {
          addr = reinterpret_cast<struct sockaddr_in*>(p->ifa_addr)->sin_addr;
          if (inet_ntop(AF_INET, &addr, name, sizeof(name)) == NULL)
            {
              perror("inet_ntop");
              continue;
            }

          cout << name << " ---> " << if_nametoindex("lo") << " : " << addr.s_addr << endl;
        }
    }

そして、私が得る出力は次のとおりです。

1.0.0.0 ---> 1 : 1
127.0.0.1 ---> 1 : 16777343

最初の結果がわかりません。これはeth#のようなものでは発生しませんが、bond0と呼ばれる別のインターフェイスでは発生します。これは何ですか?

4

1 に答える 1

6

getifaddr非標準です。Linuxシステムで使用していると思います。そこのマニュアルページには次のメモがあります。

Linuxで返されるアドレスは、通常、インターフェイスに割り当てられたIPv4アドレスとIPv6アドレスですが、インターフェイスとその物理層に関する下位レベルの詳細を含む、インターフェイスごとに1つのAF_PACKETアドレスも含まれます。この場合、ifa_dataフィールドには、で定義されたstruct net_device_statsへのポインタが含まれている場合があります。このポインタには、さまざまなインターフェイス属性と統計が含まれています。

あなたはおそらくifa_addr->sa_familyこれがあなたが期待している家族を持っているかどうかをチェックするべきです。

于 2012-05-29T21:52:29.343 に答える