获取Linux上的一个接口的IP地址

如何从C代码获取Linux上的接口的IPv4地址?

例如,我想获取分配给eth0的IP地址(如果有的话)。

尝试这个:

#include <stdio.h> #include <unistd.h> #include <string.h> /* for strncpy */ #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <net/if.h> #include <arpa/inet.h> int main() { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want to get an IPv4 IP address */ ifr.ifr_addr.sa_family = AF_INET; /* I want IP address attached to "eth0" */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); close(fd); /* display result */ printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); return 0; } 

代码示例是从这里获取的 。

除了Filip演示的ioctl()方法外,您还可以使用getifaddrs() 。 在手册页的底部有一个示例程序。

如果你正在寻找特定接口的地址(IPv4) wlan0,那么尝试使用getifaddrs()的代码:

 #include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(int argc, char *argv[]) { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if((strcmp(ifa->ifa_name,"wlan0")==0)&&(ifa->ifa_addr->sa_family==AF_INET)) { if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\tInterface : <%s>\n",ifa->ifa_name ); printf("\t Address : <%s>\n", host); } } freeifaddrs(ifaddr); exit(EXIT_SUCCESS); } 

您可以将eth0replace为以太网,将loreplace为本地环回。

所使用的数据结构的结构和详细的解释可以在这里find。

要了解更多关于链接列表在C这个页面将是一个很好的起点。

我的2美分:相同的代码工作,即使iOS:

 #include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. showIP(); } void showIP() { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if( /*(strcmp(ifa->ifa_name,"wlan0")==0)&&( */ ifa->ifa_addr->sa_family==AF_INET) // ) { if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\tInterface : <%s>\n",ifa->ifa_name ); printf("\t Address : <%s>\n", host); } } freeifaddrs(ifaddr); } @end 

我只是取消了testingwlan0来查看数据。 ps你可以删除“家庭”