gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:51 25 4
gpt4 key购买 nike

我编写使用套接字的可移植 Windows/Linux 应用程序。我使用 gethostbyname 函数来执行 DNS 查找。但是,我看不到如何设置 gethostbyname 超时并确保我的应用程序在名称查找期间不会挂起。当然,可以在另一个线程上运行 gethostbyname,我就是这样做的。但是,它只是简单应用程序的解决方案。我的应用程序并行使用 1000-3000 个连接。在这种情况下,问题是:如何处理超时线程?我没有看到好的解决方案。我们可以“忘记”它们,但是,我们面临着程序线程数在不良网络上增长到无穷大的风险。我们可以终止它们,但这个想法看起来很糟糕。根据我的经验,Windows 可能会在数千个线程终止后崩溃,我不知道 Linux 在这种情况下会如何表现。此外,线程创建需要很多资源;创建 3000 个线程只是为了运行 gethostbyname 函数并退出并不是一个好主意。因此,对于真正复杂的应用程序来说,单独的线程看起来不是个好主意。另一种选择当然是编写自己的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com