Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
bool net_get_default_interface(char *if_name, size_t size) {
if (if_name == NULL || size == 0) {
return false;
}
FILE *fp = popen("ip route show default | awk '/default/ {print $5}'", "r");
if (fp == NULL) {
printf("net_get_default_interface: popen failed\n");
return false;
}
if (fgets(if_name, size, fp) != NULL) {
size_t len = strlen(if_name);
if (len > 0 && if_name[len - 1] == '\n') {
if_name[len - 1] = '\0';
}
pclose(fp);
return true;
}
pclose(fp);
return false;
}
bool net_get_mac_address(const char* interface_name, unsigned char* mac_buffer, size_t buffer_size) {
if (mac_buffer == NULL || buffer_size < 6) {
return false;
}
struct ifaddrs *ifaddr = NULL, *ifa = NULL;
bool success = false;
if (getifaddrs(&ifaddr) == -1) {
printf("net_get_mac_address: getifaddrs failed\n");
return false;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr && strcmp(ifa->ifa_name, interface_name) == 0 &&
ifa->ifa_addr->sa_family == AF_PACKET) {
struct sockaddr_ll *s = (struct sockaddr_ll*)ifa->ifa_addr;
if (s->sll_halen == 6) {
memcpy(mac_buffer, s->sll_addr, 6);
success = true;
break;
}
}
}
freeifaddrs(ifaddr);
return success;
}
int main() {
char interface[IFNAMSIZ] = {0};
net_get_default_interface(interface, sizeof(interface));
printf("%s\n", interface);
unsigned char mac[6] = {0};
if (net_get_mac_address(interface, mac, sizeof(mac))) {
printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
} else {
printf("main: unable to get MAC\n");
}
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -interface