ipconfig
命令来查看;在Linux或macOS系统中,可以使用 ifconfig
或 ip addr
命令。
在C语言中,获取主机的IP地址是一个常见且重要的任务,尤其在网络编程和系统管理领域,下面将详细介绍几种常用的方法来获取主机的IP地址,包括使用gethostname
和gethostbyname
函数、使用getifaddrs
函数以及通过套接字接口查询。
一、使用gethostname
和gethostbyname
函数
1、获取主机名:使用gethostname
函数获取当前主机的标准主机名,该函数将主机名存储在一个字符数组中。
2、解析主机名获取IP地址:使用gethostbyname
函数将主机名解析为IP地址,这个函数会返回一个hostent
结构,其中包含了IP地址信息。
3、示例代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> int main() { char hostname[256]; if (gethostname(hostname, sizeof(hostname)) == -1) { perror("gethostname"); exit(EXIT_FAILURE); } struct hostent *he = gethostbyname(hostname); if (he == NULL) { herror("gethostbyname"); exit(EXIT_FAILURE); } struct in_addraddr_list = (struct in_addr) he->h_addr_list; for(int i = 0; addr_list[i] != NULL; i++) { printf("%s has IP: %s ", hostname, inet_ntoa(*addr_list[i])); } return 0; }
这段代码首先获取主机名,然后使用gethostbyname
解析主机名并打印出所有关联的IP地址。
1、引入头文件并定义结构:为了使用getifaddrs
函数,需要包含相关的头文件,并定义一个指针来存储接口信息。
2、获取并遍历接口信息:getifaddrs
函数将所有接口的信息存储在链表中,可以遍历这个链表来打印每个接口的IP地址。
3、示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ifaddrs.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> int main() { struct ifaddrs *ifap, *ifa; struct sockaddr_in *sa; char *addr; if (getifaddrs(&ifap) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4 sa = (struct sockaddr_in *) ifa->ifa_addr; addr = inet_ntoa(sa->sin_addr); printf("Interface: %-8s Address: %-15s ", ifa->ifa_name, addr); } } freeifaddrs(ifap); return 0; }
这段代码遍历所有网络接口,并打印出每个接口的名称和IPv4地址。
1、创建和连接套接字:创建一个UDP套接字并连接到一个外部地址(如Google的公共DNS服务器)。
2、查询套接字的本地地址:通过getsockname
函数查询套接字的本地地址,即本机的IP地址。
3、示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd; struct sockaddr_in serv_addr; struct sockaddr_in local_addr; socklen_t addr_len = sizeof(local_addr); char local_ip[INET_ADDRSTRLEN]; // 创建套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 设置服务器地址(这里以Google的公共DNS为例) memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(53); // DNS端口号 inet_pton(AF_INET, "8.8.8.8", &serv_addr.sin_addr); // 连接到服务器 if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) { perror("connect"); exit(EXIT_FAILURE); } // 获取本地地址 if (getsockname(sockfd, (struct sockaddr *)&local_addr, &addr_len) == -1) { perror("getsockname"); exit(EXIT_FAILURE); } // 转换地址为字符串形式 inet_ntop(AF_INET, &local_addr.sin_addr, local_ip, INET_ADDRSTRLEN); printf("Local IP Address: %s ", local_ip); close(sockfd); return 0; }
这段代码通过创建一个UDP套接字并连接到Google的公共DNS服务器,然后查询套接字的本地地址来获取本机的IP地址。
三种方法各有优缺点,选择哪种方法取决于具体的应用场景和需求,在实际开发中,可以根据需要选择合适的方法来获取主机的IP地址。