C语言 当inet_pton失败而getaddrinfo成功时?



在遗留代码库中,我看到了以下工作流程:

给定一个host(即const char*),第一步是使用inet_ptonhost转换为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进行转换host到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的依赖关系。

相关内容

  • 没有找到相关文章

最新更新