我有一个编写的网络实用程序。我正在使用函数 gethostbyname_r
。此函数在 Linux 环境下编译良好,但当我尝试在 MAC OS 上编译相同的代码时,出现以下错误:
‘gethostbyname_r’ was not declared in this scope
我可以在 MAC 上使用任何其他功能或对应物吗?
最佳答案
首先,您确实应该使用getaddrinfo
而不是gethostbyname
。虽然很多平台都有gethostbyname
函数,但是它的属性不一致,比如是否线程安全;它还无法让调用者指定他们更喜欢 IPv4 还是 IPv6 地址。 getaddrinfo
是作为标准化函数引入的,没有这些缺陷。
也就是说,相当于 macOS 上的 gethostbyname_r
,实际上只是 gethostbyname
。在某些平台上,例如 Linux,gethostbyname
是以非线程安全的方式实现的(将其结果返回到所有线程共享的静态缓冲区中); gethostbyname_r
不是将实现更改为线程安全的(例如通过在线程本地内存中分配该缓冲区),而是引入了调用者提供的缓冲区。但是,在 macOS 上,gethostbyname
已经是线程安全的,因此引入单独的线程安全 gethostbyname_r
被认为是不必要的。
您实际上可以根据 gethostbyname
实现您自己的 gethostbyname_r
函数。但是,更值得花费精力更改您的代码以改为使用 getaddrinfo
。
除了 macOS 之外,gethostbyname
是线程安全的(因此 gethostbyname_r
是不必要的)的其他平台包括 FreeBSD、Windows、AIX (4.3+)、HP -UX (11+) 和 z/OS UNIX。请注意,AIX 实际上有一个 gethostbyname_r
函数,尽管鉴于其 gethostbyname
是线程安全的,这完全没有必要; macOS、FreeBSD、Windows 和 z/OS UNIX 则没有。
关于c++ - 如何在 MAC OS 中使用 gethostbyname_r,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595584/