c++ - 如何在 MAC OS 中使用 gethostbyname_r

标签 c++ macos

我有一个编写的网络实用程序。我正在使用函数 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/

相关文章:

c++ - 部分特化问题

c++ - QProcess 阻止 UI 更新

macos - 安装最新版本的 OS X(Yosemite 或 El Capitan)后缺少 `pg_tblspc`

Android valgrind 构建失败

c++ - 为什么 std::getline() 在格式化提取后跳过输入?

c++ - 数组/vector 中的 SFML 2.0 c++ Sprite

swift - 如何处理 Process.run 抛出的异常

windows - 如何将 Linux wxWidgets 应用程序移植到 Windows + Mac

macos - 使用 UNUserNotificationCenter 的用户通知以及系统偏好设置中的警报设置

c++ - 具有某些特征的伪随机函数算法