C++可以使用getaddrinfo函数来通过域名获取IP地址,这是一个跨平台的函数,在Windows、Linux和其他一些操作系统上都支持。
下面是示例代码:
include
include
include
include
int main(int argc, char argv[]) {
struct addrinfo hints, res;
int status;
char ipstr[INET6_ADDRSTRLEN];
const char *hostname = "www.google.com"; // 设置需要查询的域名
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; // IPv4 或 IPv6
hints.ai_socktype = SOCK_STREAM; // TCP流
if ((status = getaddrinfo(hostname, NULL, &hints, &res)) != 0) {
std::cerr << "getaddrinfo error: " << gai_strerror(status) << std::endl;
return 1;
}
std::cout << "IP addresses for " << hostname << ":\n\n";
for (struct addrinfo *p = res; p != NULL; p = p->ai_next) {
void *addr;
char ipver[INET6_ADDRSTRLEN];
// 获取IPv4或IPv6地址
if (p->ai_family == AF_INET) {
struct sockaddr_in *ipv4 = (struct sockaddr_in *) p->ai_addr;
addr = &(ipv4->sin_addr);
strcpy(ipver, "IPv4");
} else {
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *) p->ai_addr;
addr = &(ipv6->sin6_addr);
strcpy(ipver, "IPv6");
}
// 将地址转换为IP字符串形式
inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
std::cout << ipver << ": " << ipstr << std::endl;
}
freeaddrinfo(res); // 释放链表
return 0;
}
c++
在程序运行时,将会输出如下信息:
IP addresses for www.google.com:
IPv4: 172.217.5.196
IPv6: 2607:f8b0:4009:809::2004
此示例的主要思路是:
设置addrinfo结构体协议族以及要使用的套接字类型。
调用getaddrinfo函数,并传入要查询的主机名、NULL(表示不需要服务名)以及之前设置的addrinfo结构体。
遍历返回的addrinfo链表,获取主机的IPv4或IPv6地址,并将其转换为字符串形式。
释放addrinfo链表。