gpt4 book ai didi

getaddrinfo 和 getnameinfo 的正确用法

转载 作者:可可西里 更新时间:2023-11-01 02:33:39 27 4
gpt4 key购买 nike

在我的 C 程序中,我使用 getaddrinfo 从主机名获取 IP 地址,并使用 getnameinfo 从 IP 地址获取主机名。这两个功能是互补的。我在 man getaddrinfo 中读到我必须使用 freeaddrinfo() 函数来释放为动态分配的链表 res 分配的内存.因此我的代码看起来像这样:

if ((err = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
printf("error %d\n", err);
return 1;
}

addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
printf("%s\n", inet_ntoa(addr));

freeaddrinfo(res);

但是对于 getnameinfo 我没有看到任何类似的函数,即 freenameinfo

为什么我在使用getaddrinfo 时需要free 而不是getnameinfo。为什么我需要完全释放?早些时候,当我使用 gethostbyaddr 时,不需要释放内存。为什么这是不同的。

getaddrinfo 相对于 gethostbyaddr 有什么优势?后者是否已弃用,只应使用前者?为什么?

最佳答案

getaddrinfo 的手册页中,它返回给您一个动态分配的链表。由于它执行了内存分配,因此它也将处理空闲内存是有道理的。

The freeaddrinfo() function frees the memory that was allocated for the dynamically allocated linked list res.

另请注意,函数签名包含一个 struct addrinfo **,这是一个很好的提示,表明库函数正在代表您进行分配并将指针返回给您。

   int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);

对于getnameinfo(),需要调用者(您)分配const struct sockaddr *,所以是调用者(您的)负责释放它,并且没有相应的库调用来释放它。

   int getnameinfo(const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen,
char *serv, size_t servlen, int flags);

gethostbyaddr 的手册页中,它声明自己已被弃用。

The gethostbyname*(), gethostbyaddr*(), herror(), and hstrerror() functions are obsolete. Applications should use getaddrinfo(3), getnameinfo(3), and gai_strerror(3) instead.

此时,我通常会停止阅读,不再使用 gethostbyaddr,而更喜欢 getaddrinfo

为什么不推荐使用这些函数? 可能有很多原因,但是 Wikipedia告诉我们遗留功能不支持 IPv6,正如@R.. 在下面提到的,它们是 not线程安全。

关于getaddrinfo 和 getnameinfo 的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23716257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com