我需要使用C语言显示本地计算机的所有IP地址.如何才能做到这一点?
#include#include #include #include #include #include #include #include int print_addresses(const int domain) { int s; struct ifconf ifconf; struct ifreq ifr[50]; int ifs; int i; s = socket(domain, SOCK_STREAM, 0); if (s < 0) { perror("socket"); return 0; } ifconf.ifc_buf = (char *) ifr; ifconf.ifc_len = sizeof ifr; if (ioctl(s, SIOCGIFCONF, &ifconf) == -1) { perror("ioctl"); return 0; } ifs = ifconf.ifc_len / sizeof(ifr[0]); printf("interfaces = %d:\n", ifs); for (i = 0; i < ifs; i++) { char ip[INET_ADDRSTRLEN]; struct sockaddr_in *s_in = (struct sockaddr_in *) &ifr[i].ifr_addr; if (!inet_ntop(domain, &s_in->sin_addr, ip, sizeof(ip))) { perror("inet_ntop"); return 0; } printf("%s - %s\n", ifr[i].ifr_name, ip); } close(s); return 1; } int main(int argc, char *argv[]) { int domains[] = { AF_INET, AF_INET6 }; int i; for (i = 0; i < sizeof(domains) / sizeof(domains[0]); i++) if (!print_addresses(domains[i])) return 1; return 0; }
你的问题可能不精确,但我不确定为什么每个人都在打破你的排骨.
我想你在询问基本知识,你可能想要的是getifaddrs.手册页有一个示例程序.
您还可以使用带有ioctl()的SIOCGIFCONF选项获取类似信息.这里和网上有一些示例代码.
如果您搜索这些和类似的术语,您会发现此问题之前已经以各种形式提出.你必须挖掘一下.
另请注意,如果您支持NAT,这些将不会为您提供面向公众的IP网络.
用C语言做的另一种方法我不得不说....有很多方法可以从shell中做到这一点,有什么意义呢?
#include#include #include #include #include #include #include #include #include void show_address_info( struct ifaddrs *ifa ){ struct sockaddr_in *s4; struct sockaddr_in6 *s6; /* ipv6 addresses have to fit in this buffer */ char buf[64]; if (AF_INET == ifa->ifa_addr->sa_family){ s4 = (struct sockaddr_in *)(ifa->ifa_addr); if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s4->sin_addr), buf, sizeof(buf))){ printf("%s: inet_ntop failed!\n", ifa->ifa_name); } else { printf("IPv4 addr %s: %s\n", ifa->ifa_name, buf); } } else if (AF_INET6 == ifa->ifa_addr->sa_family) { s6 = (struct sockaddr_in6 *)(ifa->ifa_addr); if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s6->sin6_addr), buf, sizeof(buf))) { printf("%s: inet_ntop failed!\n", ifa->ifa_name); } else { printf("IPv6 addr %s: %s\n", ifa->ifa_name, buf); } } } int main(int argc, char **argv){ struct ifaddrs *myaddrs, *ifa; int status; status = getifaddrs(&myaddrs); if (status != 0){ perror("getifaddrs failed!"); exit(1); } for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next){ if (NULL == ifa->ifa_addr){ continue; } if ((ifa->ifa_flags & IFF_UP) == 0) { continue; } show_address_info(ifa); } freeifaddrs(myaddrs); return 0; }