以下是一个简单的 C 代码例子,演示了如何在 Windows 下使用 getaddrinfo 函数:
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0) {
printf("WSAStartup failed with error: %d\n", result);
return 1;
}
struct addrinfo hints, *res;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC; // IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM; // TCP socket
hints.ai_protocol = IPPROTO_TCP;
result = getaddrinfo("www.example.com", "80", &hints, &res);
if (result != 0) {
printf("getaddrinfo failed with error: %d\n", result);
WSACleanup();
return 1;
}
char ipstr[INET6_ADDRSTRLEN];
// 遍历所有地址并打印
for (struct addrinfo* p = res; p != NULL; p = p->ai_next) {
void* addr;
char* ipver;
if (p->ai_family == AF_INET) { // IPv4 address
struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr;
addr = &(ipv4->sin_addr);
ipver = "IPv4";
}
else { // IPv6 address
struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr;
addr = &(ipv6->sin6_addr);
ipver = "IPv6";
}
inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
printf("%s: %s\n", ipver, ipstr);
}
freeaddrinfo(res); // 释放资源
WSACleanup();
return 0;
}
在这个例子中,我们使用了 Winsock 库来初始化网络连接,并使用 getaddrinfo 函数获取 www.example.com 的 IP 地址。然后,遍历所有返回的地址并打印出它们的版本和字符串格式的 IP 地址。
需要注意的是,在 Windows 平台上编译时需要链接 Ws2_32.lib 库文件才能使用该函数。