c++ - 套接字主机名查找超时 : how to implement it?

标签 c++ c sockets timeout gethostbyname

我编写了使用套接字的可移植 Windows/Linux 应用程序。我使用 gethostbyname 函数来执行 DNS 查找。 但是,我不知道如何设置 gethostbyname 超时并确保我的应用程序在名称查找期间不被挂起。 当然,可以在另一个线程上运行 gethostbyname ,这就是我所做的。然而,它只是针对琐碎应用的解决方案。 我的应用程序使用 1000-3000 个并行连接。在这种情况下,问题是:如何处理超时线程?我没有看到好的解决方案。我们可以“忘记”它们,但是,我们面临着在糟糕的网络上我们的程序线程数将增长到无穷大的风险。我们可以终止它们,但这个想法看起来很糟糕。根据我的经验,Windows 可能会在数千个线程终止后崩溃,而且我不知道 Linux 在这种情况下会如何表现。 另外,线程的创建需要很多资源;仅仅为了运行 gethostbyname 函数并退出而创建 3000 个线程并不是一个好主意。 因此,对于真正复杂的应用程序来说,单独的线程看起来并不是一个好主意。当然,另一种选择是编写自己的 DNS 客户端,但是,它看起来也不太好。 Windows 和 Linux 上是否有任何“官方”方法(或更好的便携方法)来获取具有自定义超时的主机地址?

最佳答案

首先:不要使用gethostbyname(),它已经过时了。请改用 getaddrinfo()

您想要的是异步名称解析。这是一个常见的要求,但不幸的是没有“标准”方法,如何做到这一点。以下是我为您找到最佳解决方案的提示:

  1. 不要实现 DNS 客户端。名称解析不仅仅是 DNS。想想 mDNS、主机文件等等。使用像 getaddrinfo() 这样的系统函数来为您抽象不同的名称解析机制。

  2. 某些系统提供异步版本的解析函数,例如 glibc 提供 getaddrinfo_a()

  3. 有一些异步解析库,它们围绕同步系统解析器函数。起初libasyncns我想到了。

  4. Boost.Asio 支持将解析器与线程池一起使用。请参阅here .

关于c++ - 套接字主机名查找超时 : how to implement it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24403435/

相关文章:

node.js - 如何为套接字传递 nginx 代理 url

c# - 将控制台聊天程序转换为 GUI

c++ - 如何通过在它之前编写的预处理器定义来获取函数签名?

c++ - 为什么我无法通过外围设备进行身份验证?

c++ - 使用抽象基类指向 SDL_Rect 类成员的指针问题

c代码文件崩溃并且编译时没有错误

python - 如何将质询密码编码到证书请求中

c# - 将文件从 Java 发送到 C#

c++ - 比较 std::pairs 的 2 个 std::lists - 保持唯一和不同的元素

c - 内存分配和动态内存分配