首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并发和可中断的DNS名称解析多个名称似乎是不可能的

并发和可中断的DNS名称解析多个名称似乎是不可能的
EN

Stack Overflow用户
提问于 2014-02-12 17:05:36
回答 1查看 237关注 0票数 2

我需要快速测试一个列表~100网络服务器的连接性。很快就意味着对整群人来说大约是5秒。如果服务器在2-3秒内无法访问,则应该跳过服务器。如果没有互联网连接-测试应该很快失败- 2-3秒。它应该在XP (SP2)和up上运行。

我决定在一个单独的线程中为每个服务器运行一个测试过程。

同步测试过程执行以下操作:

  • gethostbyname()getaddrinfo() (两者都尝试过)
  • 创建一个套接字
  • connect()
  • 发送HTTP请求
  • 读取HTTP响应(仅半it)

这是不好的:

  • 如果服务器运行缓慢,connect()将在没有超时的情况下阻塞。
  • 如果没有internet连接- gethostbyname()和getaddrinfo()阻塞了很长时间: 17+秒。

异步测试过程:

  • 创建异步消息窗口
  • WSAAsyncGetHostByName() -当解析完成时接收消息
  • WSAAsyncSelect() -接收连接,准备发送和准备读的消息
  • SetTimeout()接收超时消息并弹出
  • 运行窗口的消息循环。

这个方法也没有用,因为WSAAsyncGetHostByName()“不是为提供多个名称的并行解析而设计的”。因此,即使从多个线程调用,它也会执行顺序解析。这使得线程依次运行,从而违背了它们的目的。

因此,我的问题是:要么阻止不能中断的调用,要么阻止不能并行化的异步调用。

在我看来,唯一的选择是在单独的线程中执行阻塞调用,如果线程完成得不够快--用TerminateThread()杀死它。

还有比这更好的吗?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-12 21:10:46

我不确定这是否符合您的模型,但也许您可以将主机名的IP地址解析一次,作为一种冷开始的方式,然后缓存它们。

这样,您就可以避免使用WSAAsyncGetHostByName,这是瓶颈,您只需要测试HTTP通信。

现在,假设您有理由怀疑某个主机自上次解析它以来已经更改了它的IP地址(例如,目标无法到达,或者连接被拒绝),那么您只需为该主机再次运行一个查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21734655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档