1

次のリンク http://www.linuxhowtos.org/manpages/3/getifaddrs.htmにあるプログラムを使用しました。

ただし、loopback、eth0、eth1 lo などのすべての IP を出力します。

今、私はアクティブなipだけを取得する必要があります excpet loopback ip ex

$iffconfig eth6 Link encap:Ethernet HWaddr 08:00:27:47:99:da
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe47:99da/64スコープ: ifconfig がアクティブなインターフェイスと対応する IP を提供するためのリンク

上記のことを機能させるには、このコードで何を変更する必要がありますか?

4

1 に答える 1

4

変化する

    if (ifa->ifa_addr == NULL)
        continue;

    family = ifa->ifa_addr->sa_family;

    if (ifa->ifa_addr == NULL)
        continue;

    if ((strcmp("lo", ifa->ifa_name) == 0) ||
        !(ifa->ifa_flags & (IFF_RUNNING)))
        continue;

    family = ifa->ifa_addr->sa_family;

他のインクルードの直後にこの行を追加します

#include <net/if.h>

追加された行は、に含まれている「lo」インターフェイス名ifa->ifa_nameをチェックし、インターフェイスのフラグをチェックするだけです。IFF_RUNNINGビットをテストすると(net/if.h詳細な定義を確認してください)、実行中のインターフェースのみが返されます。

インターフェイスの他の機能を確認したい場合は、このフラグを確認してください(から取得net/if.h

  • IFF_UPインターフェイスが実行されています。
  • IFF_BROADCAST有効なブロードキャストアドレスセット。
  • IFF_DEBUG内部デバッグフラグ。
  • IFF_LOOPBACKインターフェイスはループバックインターフェイスです。
  • IFF_POINTOPOINTインターフェイスはポイントツーポイントリンクです。
  • IFF_RUNNINGリソースが割り当てられました。
  • IFF_NOARP arpプロトコルがなく、L2宛先アドレスが設定されていません。
  • IFF_PROMISCインターフェイスは無差別モードです。
  • IFF_NOTRAILERSトレーラーの使用は避けてください。
  • IFF_ALLMULTIすべてのマルチキャストパケットを受信します。
  • IFF_MASTER負荷分散バンドルのマスター。
  • IFF_SLAVE負荷分散バンドルのスレーブ。
  • IFF_MULTICASTマルチキャストをサポートします
  • IFF_PORTSELifmapを介してメディアタイプを選択できます。
  • IFF_AUTOMEDIA自動メディア選択がアクティブです。
  • IFF_DYNAMICインターフェイスがダウンすると、アドレスは失われます。
  • IFF_LOWER_UPドライバーはL1をアップに通知します(Linux 2.6.17以降)
  • IFF_DORMANTドライバーは休止状態を通知します(Linux 2.6.17以降)
  • IFF_ECHO Echoがパケットを送信しました(Linux 2.6.25以降)

編集

IPV6 GUAアドレスとULAアドレスを区別する必要がある場合は、このマクロを使用してください

#ifndef IN6_IS_ADDR_GLOBAL
#define IN6_IS_ADDR_GLOBAL(a) \
        ((((__const uint32_t *) (a))[0] & htonl(0x70000000)) \
        == htonl (0x20000000))
#endif /* IS ADDR GLOBAL */

#ifndef IN6_IS_ADDR_ULA
#define IN6_IS_ADDR_ULA(a) \
        ((((__const uint32_t *) (a))[0] & htonl(0xfe000000)) \
        == htonl (0xfc000000))
#endif /* IS ADDR ULA */

パラメータはから取得する必要があります((sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;

于 2013-01-09T12:48:26.950 に答える