Anonymous
Лучший способ получить имя текущего интерфейса
Сообщение
Anonymous » 13 фев 2026, 13:19
Я хочу получить текущее имя интерфейса, чтобы получить его MAC-адрес для использования при отправке пакетов UDP. Я вряд ли смогу получить MAC-адрес из пакета, поскольку у меня нет доступа к этому сетевому уровню, поэтому я придумал что-то вроде этого:
Код: Выделить всё
#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;
}
Я не хочу использовать команду ip для привязки к конкретной реализации. Можно ли сделать то же самое только через какой-то внутренний API?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... -interface
1770977945
Anonymous
Я хочу получить текущее имя интерфейса, чтобы получить его MAC-адрес для использования при отправке пакетов UDP. Я вряд ли смогу получить MAC-адрес из пакета, поскольку у меня нет доступа к этому сетевому уровню, поэтому я придумал что-то вроде этого: [code]#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; } [/code] Я не хочу использовать команду ip для привязки к конкретной реализации. Можно ли сделать то же самое только через какой-то внутренний API? Подробнее здесь: [url]https://stackoverflow.com/questions/79888662/best-way-to-get-the-name-of-the-current-interface[/url]