如何从C代码获取Linux上接口的IPv4地址?
例如,我想获取分配给eth0的IP地址(如果有).
试试这个:
#include#include #include /* for strncpy */ #include #include #include #include #include #include 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; }
代码示例取自此处.
除了ioctl()方法,Filip演示了你可以使用getifaddrs().手册页底部有一个示例程序.
如果您正在寻找特定接口的地址(IPv4),请说wlan0然后尝试使用getifaddrs()的代码:
#include#include #include #include #include #include #include #include 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); }
你可以用eth0替换wlan0代替ethernet,lo代替本地环回.
可以在此处找到所使用的数据结构的结构和详细说明.
要了解有关C中链表的更多信息,这个页面将是一个很好的起点.