イーサネットと他のものを区別する方法は?

ここでの回答では、マシンの場合、プログラムが実行されていたマシンのIPアドレスを取得するのに getifaddrs()を使うことができました。

しかし、2つの異なるシステム上で同じプログラムを実行すると、

SERVER_ADDRESS lo 127.0.0.1
SERVER_ADDRESS eth0 129.xxx.xxx.xxx
SERVER_ADDRESS virbr0 192.zzz.zzz.1

他方は表示される

SERVER_ADDRESS lo0 127.0.0.1
SERVER_ADDRESS en0 192.yyy.yyy.yyy

私は strcmp を使ってイーサネットを区別しようとしていましたが、異なる文字列が出力される可能性があるため、システム間では動作しません。

ifa_name がイーサネットであるかどうかをチェックする機能(またはより良い方法)がありますか?

0
ifconfig は、localhostインタフェースに LOOPBACK プロパティがあることを示しています。おそらく、その情報は何とかC言語で抽出することができます。
追加された 著者 Kerrek SB,
短いping時間はlocalhostを意味します;)
追加された 著者 mike jones,

3 答え

127.0.0.0 から 127.0.0.0 までのアドレスがあるので、 127.0.0.0/255.0.0.0 のすべてのアドレス(範囲) 127.255.255.255 は、ローカルループバックアドレスとして扱われるように定義されています。これに宛てられたデータは、ローカルマシンを離れません。

struct ifaddrs の構造体のメンバ ifa_flags をテストするだけで、 getifaddrs()次のように IFF_LOOPBACK の場合:

#include 
#include 
#include  /* for IFF_LOOPBACK */

...

struct ifaddrs * pIfAddrs = NULL;

if (!getifaddrs(&pIfAddrs)) {
  /* Test if the first interface is looping back to the local host. */
  int iIsLoopBack = (0 != (pIfAddrs->ifa_flags & IFF_LOOPBACK)); 
  ...
}

...

/* clean up */
if (pIfAddrs) {
  freeifaddrs(pIfAddrs);
  pIfAddrs = NULL;
}

...
7
追加された
ありがとうございました@、私はこのようなものを探していました!異なるIFF_XXXについて語るマニュアルページはありますか?特に virbr0 192.zzz.zzz.z も表示されるため、 ethernet を特定する必要があります。私は IFF_LOOPBACK が192.zzz.zzz.zzzを除外しないことを恐れています
追加された 著者 Some Noob Student,
私はここで読んでいる kernel.org/doc /man-pages/online/pages/man7/netdevice.7.html で、さまざまな種類の ifa_flags に関するものです。どのフラグがイーサネット接続を識別できるかを指摘できますか?ありがとう!
追加された 著者 Some Noob Student,
@シェルドン127.x.y.z.アドレスとアドレスはインターネットで使用され、127.x.y.zの違いがあります。アレックスグレイによって掲載された参考文献に記載されている住所とは異なる住所です。 ;-)後者を慣例で私的にするが、技術的に扱われる方法ではないようにするため、127.x.y.zは、それを使用するホストの外部にルーティングされないので、技術的に私的に扱われる。したがって、アレックスグレイによって参照されるアドレスを区別するためには、アドレスの値を実際にテストする必要があります。 127.x.y.zアドレスだけをプライベート(ローカル)として検出するインターフェース。
追加された 著者 alk,
net-toolsパッケージのソースを見て、 ifconfig がどのようにこれを行うことができるかを知ることができます。私もあなたのためのいくつかの例を引き出すために今これをやっていたかもしれないが、日の出が日の出だったので、今日はハイキングに行くのが好きだ... ;-)
追加された 著者 alk,
元のネットツールのソースはここから入手できます: ftp.de.debian.org/debian/pool/main/n/net-tools/…lib/interface.clib/hw.c )、また素敵で晴れた日があります! :-)
追加された 著者 alk,

あなたは、単にその問題以上のものに遭遇する可能性が高いです。たとえば、複数のNIC、vLAN、LANSのようなWANS、およびその逆などがあります。

何が分かっていますか? 127.X.X.X その結果を破棄すると、ループバックしていないことになります。

If you want to know if the address is private or not.. you'll then have to go down this road.

2
追加された
/* Output:
Name: 'eth0' Addr: 'xxx.xxx.xxx.xxx'
Name: 'eth0:0' Addr: 'xxx.xxx.xxx.xxx'
*/

    struct ifaddrs *ifaddr;
    char ip[255];

    if (getifaddrs(&ifaddr) == -1)
       {
          //sprintf(ip[0], "%s", strerror(errno));
       }
       else
       {
          struct ifaddrs *ifa;
          int i = 0, family;
          for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
          {
             if (ifa->ifa_addr == NULL)
             {
                continue;
             }
             family = ifa->ifa_addr->sa_family;
             if (family == AF_INET || family == AF_INET6)
             {
                if(!(ifa->ifa_flags & IFF_LOOPBACK) && (family == AF_INET) && getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)
                {
                   printf("Name: '%s' Addr: '%s'\n", ifa->ifa_name, ip);
                }
             }
          }
       }
       freeifaddrs(ifaddr);
1
追加された