根据手册页getaddrinfo(3)
,我需要
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
使用函数getaddrinfo
。或者,根据the standard:
#include <sys/socket.h>
#include <netdb.h>
我理解我需要来自AF_INET
的{{1}}和SOCK_STEAM
等内容。但我仍然有以下问题。
假设我只使用<sys/socket.h>
函数,我必须getaddrinfo
符合标准吗?如果是这样,为什么#include <sys/socket.h>
不包括它?如果没有,为什么手册页会在概要中包含它?
答案 0 :(得分:5)
您需要能够以有意义的方式致电getaddrinfo
的唯一标头是netdb.h
。一个示例用例是循环结果并在每个getnameinfo
上调用NI_NUMERICHOST
,以便打印主机名解析的数字地址。这不需要netdb.h
之外的任何接口。
但是,如果要将查询限制为特定的地址系列,则需要定义地址族常量(sys/socket.h
)的标头。您通常还希望使用结果来生成合适的套接字和打开的连接,这也需要sys/socket.h
。据推测,此标头包含在规范中的原因是需要访问所有(而不仅仅是某些)所提供的功能{。}}。
至于getaddrinfo
,我认为这只是Linux手册页中的瑕疵。一般情况下,永远不应该使用sys/types.h
,除非您处于只需要类型定义而不需要拉入宏常量和函数原型的情况。