Linux 获取网络接口 IP 地址的方法

Words
58
Reading
1 min
Listen
Play
9y

iotcl(), SIOCGIFCONF
这应该是属于比较"底层"的方式

getifaddrs()

static char get_local_ip(const char ifname) { 
struct ifaddrs *ifaddr = NULL; 
getifaddrs(&ifaddr);

   struct ifaddrs *p = NULL;
   char *str_if_addr = NULL;
   for(p = ifaddr ; p ; p = p->ifa_next) {
     if(p->ifa_addr == NULL) {
       continue ;
     }
     if(AF_INET == p->ifa_addr->sa_family && !strcmp(ifname, p->ifa_name)) {
       str_if_addr = inet_ntoa(((struct sockaddr_in *)p->ifa_addr)->sin_addr);
     }       
   }

   if(ifaddr) { 
     freeifaddrs(ifaddr);
   }       

   return str_if_addr;
 }

这种方式有一个问题, 就是 p->ifa_addr 可能会是 NULL(参见这里, 这里, 这里, 这里). 最好先判断一下.

Linux 获取网络接口 IP 地址的方法 | Ecency