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(参见这里, 这里, 这里, 这里). 最好先判断一下.