Мне нужно получить 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-адреса?