在遗留代码库中,我看到了以下工作流程:
给定一个host
(即const char*
),第一步是使用inet_pton
将host
转换为ip
(即uint32_t
)。如果失败,则处理第二步,即使用getaddrinfo
检索ip
(即sockaddr_in::sin_addr::s_addr)。
比;有人能给我一个例子,inet_pton失败(即。返回!= 1),而getaddrinfo成功?
谁能给我一个例子,其中inet_pton失败(即:返回!= 1),而getaddrinfo成功?
inet_pton()
将字符串形式的IP地址转换为地址结构。
getaddrinfo()
可以做同样的事情(gethostbyname()
也可以做),但它也可以查找主机名称以获得地址,并将结果填充到地址信息结构中。getaddrinfo()
也做一些其他的工作。
因此,如果给inet_pton()
一个表示主机名的字符串,比如"stackoverflow.com"
,它将失败,但是对于这样的输入,gethostbyname()
很可能成功。
给定
host
(即const char*
),第一步是使用inet_pton
进行转换hos
t到ip
(即uint32_t
)。在失败的情况下,处理步骤二是使用getaddrinfo
检索ip
这听起来像是允许通过IP地址或名称来指定机器,那些不欣赏getaddrinfo()
可以同时处理这两种情况的人。对getaddrinfo()
的调用可能在某些早期版本的软件中是对gethostbyname()
的调用,这样可以更好地解释这种混淆。
或者这个想法可能是优化路径,在假设inet_pton()
比getaddrinfo()
便宜得多的情况下,机器由IP编号标识。
无论哪种方式,我都倾向于直接进入getaddrinfo()
,而不是尝试inet_pton()
。
From maninet_pton
:
返回值
inet_pton()成功返回1(网络地址成功转换)。如果SRC不包含表示指定地址族中的有效网络地址的字符串,则返回0。如果af不包含有效的地址族,则返回-1并将errno设置为EAFNOSUPPORT。
很容易看出inet_pton
可能会失败,而getaddrinfo
有更多的"细粒度"(负)返回值(参见man getaddrinfo)。
getaddrinfo
只是一个更方便的方式来检索套接字地址。
摘自getaddrinfo
的手册页:
…
getaddrinfo()函数将gethostbyname(3)和getservbyname(3)函数提供的功能结合到一个接口中,但与后面的函数不同,getaddrinfo()是可重入的,并且允许程序消除ipv4与ipv6的依赖关系。