getaddrinfo()函数
时间: 2024-04-28 11:22:28 浏览: 86
getaddrinfo.c 内部代码
4星 · 用户满意度95%
getaddrinfo()函数是一个可移植的网络编程接口,用于将主机名和服务名转换为套接字地址结构。其原型如下:
```
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
```
其中,node参数指定主机名或IP地址,service参数指定服务名或端口号,hints参数指定地址信息的类型和其他限制条件,res参数用于返回解析得到的套接字地址结构列表。
示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
int main()
{
struct addrinfo hints, *res;
int status;
char ipstr[INET6_ADDRSTRLEN];
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo("www.google.com", "http", &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
exit(1);
}
printf("IP addresses for www.google.com:\n");
struct addrinfo *p;
for (p = res; p != NULL; p = p->ai_next) {
void *addr;
char *ipver;
if (p->ai_family == AF_INET) {
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
ipver = "IPv4";
} else {
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);
return 0;
}
```
该示例使用getaddrinfo()函数解析主机名www.google.com和服务名http,获得了该主机对应的所有IP地址,并输出到控制台。其中,hints参数指定了地址信息的类型为任意(AF_UNSPEC)和套接字类型为流式套接字(SOCK_STREAM)。对于IPv4和IPv6地址,inet_ntop()函数将其转换为点分十进制的字符串形式。最后,使用freeaddrinfo()函数释放getaddrinfo()函数返回的addrinfo结构体。
阅读全文