Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Получить имя сетевого интерфейса в linux

#cpp #linux #сокет


Начал выкладывать свою библиотеку: https://github.com/mikelsv/opensource , возникла
проблема в примере mping.

Для получения ответов от пингуемого хоста нужно включить прослушивание интерфейса.
В коде по умолчанию используется интерфейс eth0, которого вполне может и не быть. Собственно
на VPS где проверяется работоспособность этого интерфейса нет, вследствие чего возникает
ошибка.

Текущая реализация: https://github.com/mikelsv/opensource/blob/master/msvcore/net/sniffer.h#L56
и https://github.com/mikelsv/opensource/blob/master/msvcore/net/sniffer.h#L96

unsigned char device[1024];
strcpy((char*)device, "eth0");
strcpy((char*)interface.ifr_name,(char*)device);
if(ioctl(sock,SIOCGIFFLAGS,&interface)<0){ printf("failed reading data for %s!\n",device);
return 1; }


Так как интерфейса eth0 в системе нет, вылетает ошибка "failed reading data for eth0".

Как получить имя интерфейса существующего интерфейса? Так, чтобы у интерфейса был
реальный ip. Как вариант, можно передавать в функцию локальный ip с которого послан
пинг, тогда как получить название интерфейса зная его ip?

Код старый, написан коряво, переписывать смысла нет, а работоспособность восстановить
хочется.
    


Ответы

Ответ 1



думаю, вам подойдёт функция getifaddrs. описание и пример применения смотрите командой $ man getifaddrs либо в интернете

Ответ 2



Утилита ifconfig возвращает список интерфейсов, их состояние и адреса на них. Вот тут пишут как получить тот же результат не вызывая стороннюю программу.

Ответ 3



Можно посмотреть в файле конфигураций: sudo nano /etc/network/interfaces Или выполнить команду: ifconfig -a

Комментариев нет:

Отправить комментарий