8

次のコードを使用して、現在のコンピューターのすべての 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 がアクティブでないためです (イーサネット ケーブルが接続されていないため、ケーブルが返されます)。「オフ」になっている場合でも、その ioctl(SIOCGIFCONF) コマンドを変更して eth0 も取得できますか?

直接使用してHWアドレスを取得できます

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

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

しかし、名前が eth0 ではなく、別のもの (eth1、em0、...) になる場合はどうでしょうか? 全部手に入れたいです。手伝ってくれてありがとう。

4

4 に答える 4

10

net-tools と古風な ioctl インターフェイスの使用をやめ、最新の Netlink/sysfs インターフェイスの使用を開始する必要があります。5 つ以上の可能性があります。

  • 独自の Netlink インターフェース コードを作成する
  • libmnlを組み合わせて使用​​する独自の NL コード(->の rtnl-link-dump を参照)
  • またはlibnl3のような自律ライブラリを利用する
  • テキスト出力を解析しますip -o link(-o は、ifconfig とは異なり、テキスト解析用の出力を取得するためのものです)
  • またはsysfsを使用して見てください/sys/class/net/eth0/address
于 2012-01-27T17:04:34.570 に答える
0

それほどエレガントではないかもしれませんが、ifconfig から結果をキャプチャして解析することができます。

于 2012-01-27T14:26:49.593 に答える