解析主机名

时间:2014-05-16 17:43:33

标签: c sockets

我可以用

解析主机名
  

getaddrinfo()

然后验证地址。我可以用

  

connect(socket,sockaddr,len)

我不确定连接是做什么的。因为如果我尝试修改主机文件,例如修改主机名的ip-address。我的connect()仍然可以正常工作。

e.g。

  

foo.bar 1.1.1.1 ---> foo.bar 2.2.2.2

无论如何要知道哦,现在没有更多1.1.1.1是有效的,它的2.2.2.2

1 个答案:

答案 0 :(得分:1)

getaddrinfo()翻译包含addrinfo结构的sockaddr结构,这些结构又可以用于connect()套接字,它只关心原始IPv4 / IPv6 / Unix域地址。 connect()需要原始地址,但不知道或关心它们来自何处(翻译,硬编码为32位整数等),并且连接到地址实际上并不验证翻译的地址是“对“一,只是请求的原始地址上的某个服务器在请求的端口上打开。

这听起来好像你想要缓存已翻译的地址,这通常是有益的,但你似乎也期望更改名称映射被“推送”给你。除非您正在运行nscd(名称服务缓存守护程序),否则Linux系统通常不会在操作系统级别缓存地址转换,即使这样,也没有使用DNS转换向应用程序推送更新的形式。您只需偶尔重新翻译名称,看看sockaddr是否已更改。

如果您知道相关的名称/地址更改将来自频繁的本地/etc/hosts修改(非常不可能的情况,很可能!),您可以考虑使用inotify来监控该文件更新,在看到更改时刷新本地名称缓存。