Вы можете сделать следующее, чтобы получить индекс интерфейса:
Сначала создайте сокет UDP к месту назначения:
int fd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in in;
in.sin_family = AF_INET;
in.sin_port = htons(1234);
in.sin_addr.s_addr = inet_addr("1.2.3.4");
connect(fd, (struct sockaddr *)&in, sizeof(struct sockaddr_in));
Затем вызовите getsockname()
, чтобы определить адрес интерфейса. исходящего интерфейса для этого сокета:
int inlen = sizeof(in);
getsockname(fd, (struct sockaddr *)&in, &inlen);
Теперь получите все структуры интерфейса системы и найдите правильный адрес интерфейса:
struct ifaddrs *ifa, *ifap;
getifaddrs(&ifa);
ifap = ifa;
char *ifname = NULL;
while (ifa) {
if (((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr ==
in.sin_addr.s_addr) {
ifname = strdup(ifa->ifa_name);
break;
}
ifa = ifa->ifa_next;
}
freeifaddrs(ifap);
Наконец, получите индекс интерфейса для интерфейса name:
struct ifreq iface;
strncpy(iface.ifr_name, interface, IFNAMSIZ);
iface.ifr_name[IFNAMSIZ-1] = 0;
int len = sizeof(iface);
ioctl(fd, SIOCGIFINDEX, &iface, &len);
int ifindex = iface.ifr_ifindex;
Выглядит немного сложно, но не зависит от netlink (что тоже не намного проще).