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

最佳答案

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

您想要的是异步名称解析。这是一个普遍的要求,但是不幸的是,没有“标准”的方式,即如何去做。这里是我为您找到最佳解决方案的提示:

  • 不实现DNS客户端。名称解析不仅仅是DNS。考虑一下mDNS,托管文件等。使用像getaddrinfo()这样的系统函数为您抽象出不同的名称解析机制。
  • 某些系统提供了解析功能的异步版本,例如glibc提供了getaddrinfo_a()
  • 有异步解决方案库,它们包装在同步系统解析器函数中。首先,我想到了libasyncns
  • Boost.Asio支持将解析器与线程池一起使用。参见here
  • 关于c++ - 套接字主机名查找超时: how to implement it?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24403435/

    10-11 15:51