【问题标题】:Resolving host name解析主机名
【发布时间】:2014-05-16 17:43:33
【问题描述】:

我可以用

解析主机名

getaddrinfo()

然后验证地址。我可以使用

连接(套接字,sockaddr,len)

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

例如

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

有没有知道的哦,现在没有1.1.1.1有效了,它的2.2.2.2

【问题讨论】:

  • 您可以缓存第一次查找的结果,并比较后续查找产生的值是否与之前不同。

标签: c sockets


【解决方案1】:

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

听起来您还想缓存已翻译的地址,这通常是有益的,但您似乎也希望更改的名称映射被“推送”给您。 Linux 系统通常不会在 OS 级别缓存地址转换,除非您正在运行 nscd(名称服务缓存守护进程),即便如此,也无法使用 DNS 转换向应用程序推送更新。您只需偶尔重新翻译名称,看看sockaddr 是否已更改。

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

【讨论】:

  • 谢谢。这有帮助。是的,我缓存了翻译后的地址,我不想一直这样做。因此,如果我理解正确,连接不关心 /etc/hosts .. 那么没有任何关心的 API 吗?我也看到绑定了。如果他们不检查 /etc/hosts/ 那么有没有办法尝试验证这一点? (当然你已经建议了 inotify,还在疑惑!)
  • @codemuncher Linux/POSIX 中的任何地方都没有套接字DNS API。 getaddrinfo() / gethostbyname() 将名称转换为数字地址,而不关心这些地址是否会被使用。在进行外部查询之前,getaddrinfo() 调用查询/etc/hosts 的系统地址转换服务以获取在那里配置的覆盖。因为getaddrinfo() 是无状态的并且不是连接/事件通知机制,所以系统无法发出更改信号,但您可以查看文件以查看您之前查找的内容是否会发生更改。
  • @codemuncher 为了进一步澄清,所有套接字 API 调用,包括 socket()bind()listen()accept()connect() 只关心 IPv4/v6 的数字地址.主机名翻译与可能使用最终翻译值的套接字完全分开。 inotify 只是一个用于监视文件和目录更改的 API,因此它只能告诉您,例如,/etc/hosts 已被某人修改。这个解决方案非常老套,因为它涵盖了一种非常罕见的情况,并且不能解决 DNS 服务器上的地址被更改的问题,而这种情况更为常见。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2013-11-05
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多