変化する
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;