getaddrinfo 函数详解

域名解析
域名解析是将域名转换为IP地址的过程,它是互联网中的一项基本功能,在进行网络通信时,我们通常使用域名来访问网站或服务,而服务器则需要通过IP地址来识别客户端,域名解析是连接域名与IP地址之间的桥梁。
getaddrinfo 函数简介
getaddrinfo 函数是C语言中用于域名解析的一个函数,它可以将域名转换为对应的IP地址,该函数是POSIX标准的一部分,广泛应用于各种操作系统和编程语言中。
getaddrinfo 函数原型
int getaddrinfo(const char *nodename, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
nodename 表示要解析的域名,servname 表示要访问的服务类型(如HTTP、FTP等),hints 是一个指向addrinfo结构的指针,用于指定解析过程中的限制条件,res 是一个指向addrinfo结构指针的指针,用于存储解析结果。

getaddrinfo 函数参数详解
-
nodename:要解析的域名,如 “www.example.com”。
-
servname:要访问的服务类型,如 “http” 或 “ftp”。
-
hints:指向addrinfo结构的指针,用于指定解析过程中的限制条件,如协议类型、地址族、端口等。
-
res:指向addrinfo结构指针的指针,用于存储解析结果。
getaddrinfo 函数返回值

getaddrinfo 函数返回值表示解析结果,具体如下:
- 0:解析成功。
- 非零值:解析失败,错误码可以通过errno获取。
getaddrinfo 函数示例
以下是一个使用getaddrinfo函数解析域名的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
int main() {
struct addrinfo hints, *res, *rp;
int ret;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; // IPv4 和 IPv6 都可以
hints.ai_socktype = SOCK_STREAM; // 流式套接字
hints.ai_flags = AI_PASSIVE; // 使用任意本地端口
ret = getaddrinfo("www.example.com", "80", &hints, &res);
if (ret) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
return 1;
}
for (rp = res; rp != NULL; rp = rp->ai_next) {
char ipstr[INET6_ADDRSTRLEN];
void *addr;
// 获取IPv4地址
if (rp->ai_family == AF_INET) {
struct sockaddr_in *ipv4 = (struct sockaddr_in *)rp->ai_addr;
addr = &(ipv4->sin_addr);
}
// 获取IPv6地址
else {
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)rp->ai_addr;
addr = &(ipv6->sin6_addr);
}
inet_ntop(rp->ai_family, addr, ipstr, sizeof(ipstr));
printf("IP address: %s\n", ipstr);
}
freeaddrinfo(res); // 释放addrinfo结构
return 0;
}
getaddrinfo 函数是C语言中用于域名解析的一个强大工具,它可以帮助我们轻松地将域名转换为IP地址,了解getaddrinfo函数的使用方法和参数,可以让我们更好地进行网络编程。


















