列举分配给networking接口的每个IP地址

我认为没有办法枚举我的系统上的每个networking接口和他们分配的IP地址只使用套接字。 它是否正确?

我的意思是,在Linux中,这可能是:

eth0: 192.168.1.5 wlan0: 192.168.0.5 lo: 127.0.0.1 

我不在乎接口名称,只是分配的IP地址。

我记得以前在Windows下用Win32做过这个(尽pipe我不记得怎么做)。 但有没有办法以便携的方式做到这一点?

Solutions Collecting From Web of "列举分配给networking接口的每个IP地址"

这是一个好的开始:

 #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <ifaddrs.h> #include <stdio.h> void print_sockaddr(struct sockaddr* addr,const char *name) { char addrbuf[128] ; addrbuf[0] = 0; if(addr->sa_family == AF_UNSPEC) return; switch(addr->sa_family) { case AF_INET: inet_ntop(addr->sa_family,&((struct sockaddr_in*)addr)->sin_addr,addrbuf,sizeof(addrbuf)); break; case AF_INET6: inet_ntop(addr->sa_family,&((struct sockaddr_in6*)addr)->sin6_addr,addrbuf,sizeof(addrbuf)); break; default: sprintf(addrbuf,"Unknown (%d)",(int)addr->sa_family); break; } printf("%-16s %s\n",name,addrbuf); } void print_ifaddr(struct ifaddrs *addr) { char addrbuf[128] ; addrbuf[0] = 0; printf("%-16s %s\n","Name",addr->ifa_name); if(addr->ifa_addr != NULL) print_sockaddr(addr->ifa_addr,"Address"); if(addr->ifa_netmask != NULL) print_sockaddr(addr->ifa_netmask,"Netmask"); if(addr->ifa_broadaddr != NULL) print_sockaddr(addr->ifa_broadaddr,"Broadcast addr."); if(addr->ifa_dstaddr != NULL) print_sockaddr(addr->ifa_dstaddr,"Peer addr."); puts(""); } int main(int argc,char *argv[]) { struct ifaddrs *addrs,*tmp; if(getifaddrs(&addrs) != 0) { perror("getifaddrs"); return 1; } for(tmp = addrs; tmp ; tmp = tmp->ifa_next) { print_ifaddr(tmp); } freeifaddrs(addrs); return 0; } 

使用gethostname()来检索机器的本地DNS名称,然后将该名称传递给gethostbyname()以获取其本地IP地址。

如果操作系统支持IPv6,请查看getaddrinfo()函数而不是gethostbyname()

看看ioctl()函数。 如果我没有记错的话,你可以用它来获取任何接口的信息,以及获取可用的接口。

我不记得正确的调用。 和fcntl() ,它需要一个请求参数和确定其行为的变量参数。

在Linux上,通过NETLINK套接字访问这些信息。 请参阅libnetlink(3),netlink(7)和rtnetlink(7)的手册页。

通过ioctl()来实现这个更简便的方法。 SIOCGIFCONF是你想要的。 请参阅netdevice的手册页(7)。 这个可以在其他的* nixes上运行。