Anda dapat memeriksa entri mana dari getifaddrs milik keluarga AF_PACKET. Di sistem saya yang sepertinya mencantumkan semua antarmuka:
struct ifaddrs *addrs,*tmp;
getifaddrs(&addrs);
tmp = addrs;
while (tmp)
{
if (tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_PACKET)
printf("%s\n", tmp->ifa_name);
tmp = tmp->ifa_next;
}
freeifaddrs(addrs);
getifaddrs() hanya akan mengembalikan alamat antarmuka Anda, bukan antarmuka itu sendiri.
Bagaimana jika salah satu antarmuka Anda tidak memiliki alamat, atau tidak ada alamat keluarga yang diminta, seperti yang disarankan dengan 'AF_PACKET'?
Di sini, contoh di mana saya memiliki antarmuka terowongan (dengan koneksi OpenVPN), dan di mana saya mencantumkan semua entri dari getifaddrs() untuk setiap antarmuka jaringan saya:
[0] 1: lo address family: 17 (AF_PACKET) b4:11:00:00:00:01
address family: 2 (AF_INET) address: <127.0.0.1>
address family: 10 (AF_INET6) address: <::1>
[...]
[5] 10: tun0 address family: 2 (AF_INET) address: <172.16.0.14>
[EOF]
Bam. Tidak ada AF_PACKET di antarmuka "tun0", tetapi TIDAK ada di sistem.
Sebaliknya, Anda harus menggunakan if_nameindex() syscall, yang melakukan apa yang Anda inginkan. Dengan kata lain, tanpa argumen, ia mengembalikan daftar semua antarmuka di sistem Anda:
#include <net/if.h>
#include <stdio.h>
int main (void)
{
struct if_nameindex *if_nidxs, *intf;
if_nidxs = if_nameindex();
if ( if_nidxs != NULL )
{
for (intf = if_nidxs; intf->if_index != 0 || intf->if_name != NULL; intf++)
{
printf("%s\n", intf->if_name);
}
if_freenameindex(if_nidxs);
}
return 0;
}
Dan voila.