次のコードを使用して、現在のコンピューターのすべての 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、...) になる場合はどうでしょうか? 全部手に入れたいです。手伝ってくれてありがとう。