问题:
确定 Linux 的 IP 地址机器使用 C 编程,专门针对多个潜在的公共 IP 地址地址。
解决方案:
getifaddrs() 函数为在 Linux 和 POSIX 上检索 IP 地址提供了更可靠的方法- 兼容的操作系统。它返回 ifaddrs 结构的链表,每个结构代表一个网络接口及其关联的地址。下面是演示其用法的代码示例:
#include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> int main (int argc, const char * argv[]) { struct ifaddrs * ifAddrStruct=NULL; struct ifaddrs * ifa=NULL; void * tmpAddrPtr=NULL; getifaddrs(&ifAddrStruct); for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) { continue; } if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4 // is a valid IP4 Address tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6 // is a valid IP6 Address tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } } if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct); return 0; }
在代码中,getifaddrs() 用网络接口信息填充 ifAddrStruct 链表。每个 ifaddrs 结构都包含一个 ifa_addr 成员,它是指向代表 IP 地址的套接字地址结构的指针。 AF_INET 用于 IPv4 地址,AF_INET6 用于 IPv6 地址。
代码迭代链表,检查 ifa_addr 是否有效,然后通过将其转换为人类地址来检索并打印 IP 地址字符串使用inet_ntop()的可读格式。
要识别公共IP地址,您可以检查网络接口名称(例如“eth0”)或比较 IP 地址以确定哪一个与外部网络匹配。
以上是如何用 C 语言以编程方式检索 Linux 机器的 IP 地址?的详细内容。更多信息请关注PHP中文网其他相关文章!