c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息
程序员文章站
2022-05-01 16:53:49
网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数。 1,if_nameindex 取得网卡名字和网卡编号 "github源代码" 2,ioctl 取得网卡的名字。 注意点:ioctl ......
网络编程 udp 用if_nameindex和ioctl取得主机网络信息
getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数。
1,if_nameindex 取得网卡名字和网卡编号
#include <stdio.h> #include <net/if.h> int main(){ struct if_nameindex *idxlist, *idx; idxlist = if_nameindex(); if(idxlist == null){ perror("if_nameindex"); return 1; } for(idx = idxlist; idx->if_name != null && idx->if_index != 0;++idx){ printf("%s\t%d\n", idx->if_name, idx->if_index); } if_freenameindex(idxlist); return 0; }
2,ioctl 取得网卡的名字。
注意点:ioctl调用了2次,第一次是为了得到ifc.ifc_len,第二次用得到了ifc.ifc_len的精确大小,来开辟内存空间。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <net/if.h> #include <sys/ioctl.h> int main(){ ifconf ifc; ifreq* ifr; int fd; int nifs, i; fd = socket(af_inet, sock_dgram, 0); ifc.ifc_len = 0; ifc.ifc_ifcu.ifcu_buf = null; ioctl(fd, siocgifconf, &ifc); printf("%d\n", ifc.ifc_len); if(ifc.ifc_len == 0){return 1;} ifc.ifc_ifcu.ifcu_buf = (char*)malloc(ifc.ifc_len); ioctl(fd, siocgifconf, &ifc); nifs = ifc.ifc_len / sizeof(ifreq); ifr = (ifreq*)ifc.ifc_ifcu.ifcu_buf; for(i = 0; i < nifs; ++i){ printf("%s\n",ifr[i].ifr_name); } close(fd); return 0; }