2012-01-27 15 views
7

すべてのインターフェイスのC/C++ LinuxのMACアドレス

ifreq ifr; 
ifconf ifc; 
char buf[1024]; 

int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 
if (sock == -1) { ... }; 

ifc.ifc_len = sizeof(buf); 
ifc.ifc_buf = buf; 
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { ... } 

ifreq *it = ifc.ifc_req; 
const ifreq* const end = it + (ifc.ifc_len/sizeof(ifreq)); 

for (; it != end; ++it) { 
    strcpy(ifr.ifr_name, it->ifr_name); 
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { 
     if (!(ifr.ifr_flags & IFF_LOOPBACK)) { 
      if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { 
       unsigned char mac_address[6]; 
       memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6); 
       ... 
      } 
     } 
    } 
    else { ... } 
} 

簡単なシェルコマンドifconfigを実行することにより、私は、LO、eth0とwlan0を見ることができます。 C/C++コードでeth0とwlan0のMACアドレスを取得したいと思います。しかしwlan0だけが返されます - eth0はありません(私はifr_names lo、lo、wlan0を持っています)。おそらく、eth0がアクティブでない(イーサネットケーブルが接続されていない、ケーブルが接続されていない)ためです。 「オフ」にしてもeth0を取得するためにioctl(SIOCGIFCONF)コマンドをどうにか変更することはできますか?

私が直接

struct ifreq s; 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

    strcpy(s.ifr_name, "eth0"); 
    if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { ... } 

が、何名がeth0のではないだろう場合はを使用することによって、そのHWアドレスを取得することができます何か他のもの(eth1の、EM0、...)?私はそれらのすべてを手に入れたいです。手伝ってくれてありがとう。

答えて

9

net-toolsと古風なioctlインタフェースの使用をやめ、現代のNetlink/sysfsインタフェースを使い始めるべきです。あなたは何の5つの未満の可能性があります。

  • は(libmnlを利用し組み合わせて、独自のするNetlink-インタフェースコード
  • 独自のNLコードを書いていない - >Examples
  • にrtnlリンクダンプを参照しますか、 ip -o linkのlibnl3
  • 解析テキスト出力(-oは、出力はifconfigコマンドとは異なり、テキスト解析のためのものを取得することである)
  • または使用のsysfs、ちょうどLOなどの自律LIBSを利用OK /sys/class/net/eth0/address
0

多分エレガントではないかもしれませんが、あなたが探しているものがあるように聞こえるので、&の結果をifconfigから解析することができます。

+0

おかげで、それは常に解決策ですが、私はむしろ問題となる可能性がifconfigコマンドの結果を解析し、いくつかのC液を使用することになり、フォーマットは、など – user1173626

1

あなたはここで解決策を見つけることができます:Get mac address given a specific interface

あなただけの特定のインターフェイス部分をスキップすることができます。

+0

おかげで異なるLinuxのバージョンと異なる場合がありますが、私はよあなたが何を意味するのか分からない。あなたのコード例では、すべてが、argv [1]という名前のインタフェースのパラメータを要求しています。これは、例えば、2番目のコードスニペットのようにeth0です。それはいいです。しかし、私はすべてのインターフェイスをリストする必要があります。あなたが示唆しているように「特定の」部分をスキップすることで、何が残るでしょうか?私は詳細(MAC)を求めるインターフェイスのいくつかのリストを取得する必要があります、それは正しいですか?私が理解する限り、それはSIOCGIFCONFを呼び出すことによって私が行うことです。しかし、eth0はリストに含まれていません。 – user1173626

+0

これらの2つの答えを組み合わせるにはどうすればいいのでしょうか?ifconfigの結果を構文解析して(私はかなりプラットフォームには無関係だと思います)、見つけた名前ごとにMACアドレスを調べます。 –

+0

ifconfigのソースを取得して、これらの名前がどのように見つかるかを確認してください。 –

関連する問題