Есть ли способ получить IP-адрес из имени интерфейса в Linux, не полагаясь на ioctl или getifaddrs? - PullRequest
1 голос
/ 19 марта 2020

Мне нужно получить IP-адрес определенного интерфейса Linux программно и с использованием C, учитывая его имя.

Я знаю, что могу сделать это, полагаясь на ioctl, как в следующем фрагменте кода:

struct ifreq ifreq;
struct in_addr ifIP;
int dummysfd;

dummysfd=socket(AF_INET,SOCK_DGRAM,0);

// devname is a char* containing my interface name
strncpy(ifreq.ifr_name,devname,IFNAMSIZ);
ifreq.ifr_addr.sa_family=AF_INET;
if(ioctl(dummysfd,SIOCGIFADDR,&ifreq)!=-1) {
    ifIP=((struct sockaddr_in*)&ifreq.ifr_addr)->sin_addr;
} else {
    fprintf(stderr,"Error: cannot retrieve IP address for interface %s.\n",devname);
}

close(dummysfd);

Это решение, хотя и работает правильно, имеет недостаток, заключающийся в необходимости создания фиктивного сокета, просто для получения IP-адреса.

My сомнение заключается в том, существует ли другой метод для получения IP-адреса непосредственно из имени интерфейса, например, без сканирования всех доступных интерфейсов (как это было бы при использовании getifaddrs) и без использования метода, который требует открытия фиктивного сокета для быть передано в ioctl.

Существует ли такая функция, как if_nametoindex() (определенная в <net/if.h>), но которая возвращает индекс вместо IP-адреса?

...