当getaddrinfo
函数的node
参数为NULL
时,表示它不会针对特定的主机名进行地址解析。这意味着在获取地址信息时,不会根据主机名来查询对应的IP地址,而是直接使用传入的其他参数(如服务名或端口号)进行解析。
通常情况下,当需要连接本地主机或已知IP地址时,可以将node
参数设置为NULL
。例如,在创建服务器套接字时,如果只想监听本地主机上的某个特定端口号,则可以将node
设置为NULL
。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
int main() {
const char *port = "8080";
struct addrinfo hints, *res;
// 初始化hints结构体
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
// 将node参数设置为NULL
const char *node = NULL;
// 调用getaddrinfo函数进行解析
int status = getaddrinfo(node, port, &hints, &res);
if (status != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
// 遍历并打印结果链表中的每个地址信息
struct addrinfo *p;
for (p = res; p != NULL; p = p->ai_next) {
char ip[INET6_ADDRSTRLEN];
void *addr;
if (p->ai_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
} else { // IPv6
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
}
inet_ntop(p->ai_family, addr, ip, sizeof(ip));
printf("IP address: %s\n", ip);
}
freeaddrinfo(res); // 释放链表
return 0;
}
在上述示例中,将node
参数设置为NULL
,并指定了服务端口号为”8080”。这样就可以获取本地主机上特定端口的地址信息,并进行打印输出。
内容由零声教学AI助手提供,问题来源于学员提问