Получите информацию о всех интерфейсах от «/ proc/net/dev». Примечание: он не может использовать все интерфейсы только с помощью ioctl.
#define PROC_NETDEV "/proc/net/dev"
fp = fopen(PROC_NETDEV, "r");
while (NULL != fgets(buf, sizeof buf, fp)) {
s = strchr(buf, ':');
*s = '\0';
s = buf;
// Filter all space ' ' here
got one interface name here, continue for others
}
fclose(fp);
Тогда получите адрес, используя IOCTL():
struct ifreq ifr;
struct ifreq ifr_copy;
struct sockaddr_in *sin;
for each interface name {
strncpy(ifr.ifr_name, ifi->name, sizeof(ifr.ifr_name) - 1);
ifr_copy = ifr;
ioctl(fd, SIOCGIFFLAGS, &ifr_copy);
ifi->flags = ifr_copy.ifr_flags;
ioctl(fd, SIOCGIFADDR, &ifr_copy);
sin = (struct sockaddr_in*)&ifr_copy.ifr_addr;
ifi->addr = allocating address memory here
bzero(ifi->addr, sizeof *ifi->addr);
*(struct sockaddr_in*)ifi->addr = *sin;
/* Here also you could get netmask and hwaddr. */
}
Домашнее задание? Что у вас есть до сих пор? – GManNickG
Вы должны отметить, что в производственном коде, использующем 'ifconfig', не самое худшее решение. –
Не волнуйтесь, это не моя домашняя головоломка .... Я становлюсь более вовлеченным в какое-то серьезное программирование на C, в результате пытаюсь исправить недостающие ссылки в моем приложении .... – codingfreak