Лучший способ получить имя текущего интерфейсаLinux

Ответить
Anonymous
 Лучший способ получить имя текущего интерфейса

Сообщение Anonymous »

Я хочу получить текущее имя интерфейса, чтобы получить его 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»