getaddrinfo怎么用
时间: 2024-05-10 21:15:22 浏览: 84
getaddrinfo.c 内部代码
4星 · 用户满意度95%
getaddrinfo函数是一个用于将主机名和服务名转换为套接字地址信息的函数。它的使用方法如下:
```c
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
```
参数说明:
- `node`:要连接的主机名或 IP 地址,可以为 NULL(表示本地地址);
- `service`:服务名或端口号字符串;
- `hints`:指向一个 `addrinfo` 结构的指针,用于指定期望的地址族、套接字类型和协议,可为 NULL;
- `res`:返回的地址信息链表。
返回值:
- 成功返回 0;
- 失败返回非零错误码,可通过 `gai_strerror` 函数将错误码转换为字符串。
示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
struct addrinfo hints;
struct addrinfo *res, *p;
int status;
char ipstr[INET6_ADDRSTRLEN];
if (argc != 2) {
fprintf(stderr, "usage: %s hostname\n", argv[0]);
return 1;
}
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // IPv4 或 IPv6
hints.ai_socktype = SOCK_STREAM; // TCP
hints.ai_flags = AI_PASSIVE; // 自动填充本机 IP
if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
return 2;
}
printf("IP addresses for %s:\n\n", argv[1]);
for (p = res; p != NULL; p = p->ai_next) {
void *addr;
char *ipver;
if (p->ai_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *) p->ai_addr;
addr = &(ipv4->sin_addr);
ipver = "IPv4";
} else { // IPv6
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;
}
```
该示例代码用于获取指定主机名的所有 IP 地址,并打印输出。其中,`getaddrinfo` 函数所需的 `hints` 结构体被初始化为期望获取 IPv4 或 IPv6 地址,并且使用 TCP 连接。`res` 是获取到的地址信息链表,需要在使用完毕后调用 `freeaddrinfo` 函数释放。`inet_ntop` 函数用于将网络字节序的二进制地址转换为文本格式的 IP 地址字符串。
阅读全文