【问题标题】:How can I get a consistent result from gethostname() on OS X?如何在 OS X 上从 gethostname() 获得一致的结果?
【发布时间】:2011-05-02 12:01:29
【问题描述】:

当我在我的 Mac 上调用 gethostname() 时,有时它返回“george”,有时它返回“George.local”。我可以更改什么以使其始终返回相同的内容? (我不在乎哪个;我只是希望它保持一致。)

背景:我在运行 10.6 的 Mac 上使用 Unison (www.cis.upenn.edu/~bcpierce/unison/index.html)。 Unison 使用多种事物(其中之一是主机名)来命名保存先前结果的文件。当 gethostname() 返回的字符串发生变化时,Unison 找不到之前的文件。这会导致各种不愉快的行为。

最初配置系统时,我将共享控制面板中的名称设置为“乔治”。目前,当我使用 hostname 命令时,它返回“george”。前几天在使用 Unison 的时候,Unison 使用了“George.local”这个名字。在过去的几个月里,我多次看到 Unison 的这种行为。

在这段时间里,我改变了很多东西;我不知道哪个(如果有的话)可能很重要。

1) 我在笔记本电脑上执行此操作。在不同的时间,它连接到不同的路由器,有时根本没有连接。

2) 我可能两次升级了 OS X 版本。对于当前的问题,我确定我确实升级了(从 10.6.6 到 10.6.7)。以前发生的事,我不记得了。

3) 有时我使用 Airport 连接,有时使用电缆。

谁能解释 gethostname() 可能在做什么以及为什么它可能返回不同的字符串?

谢谢,帕特

(2011 年 5 月 1 日更新)问题似乎是 OS X 和我的 AT&T DSL 服务的 2Wire 路由器之间的不良交互。当我在未连接到网络的情况下启动时,主机名返回“George.local”,这是我在“共享”控制面板中设置的。一旦我使用以太网或 AirPort 连接到路由器,主机名现在返回“george”。

在那个特定的路由器中是否有一些配置选项可以控制这个?

我的 Verizon FIOS 路由器或 Verizon DSL 都没有发生这种情况。我不记得那些路由器的品牌,但 2Wire 也不是。

【问题讨论】:

标签: macos router


【解决方案1】:

不如我提供一个不同的替代方案? gethostbyname() 实际上是一个较旧的 API,实际上不是当前推荐使用的 API。当前推荐使用的 API 是 getaddrinfo(),它已经标准化并且几乎无处不在。你应该考虑改用那个!

【讨论】:

  • 嗨,韦斯。为了澄清一些事情,您说不推荐使用“gethostbyname”。 Unison 使用“gethostname”,它是 POSIX 库的一部分。所以,除非我误解了什么,否则这个建议实际上并不适用于当前情况。我错过了什么吗?
  • 我并不是说它不存在并且不会存在很长时间。但是,它不是可移植的(因为并非所有内容都符合 POSIX),并且 getaddrinfo 旨在以更好的方式处理多种事情(如 IPv6 地址)。它在 RFC 3493 中定义,并且在任何地方都得到一致实施。现在...不过,我再说一遍:你可以仍然使用 gethostbyname()
  • gethostname 与 gethost_by_name。两种不同的叫法。这就是我所质疑的。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2021-07-17
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
相关资源
最近更新 更多