我需要快速测试约100个Web服务器的连接性列表。快速表示整个过程大约需要5秒。如果大约2-3秒钟无法访问服务器,则应将其跳过。如果没有互联网连接-测试应该很快失败-2-3秒。它应在XP(SP2)及更高版本上运行。

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

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

  • gethostbyname()getaddrinfo()(均尝试)
  • 创建一个套接字
  • connect()
  • 发送HTTP请求
  • 读取HTTP响应(仅半字节)

  • 这不好:
  • 如果服务器速度较慢,则connect()会阻塞并且没有超时。
  • 如果没有互联网连接,则为
  • -gethostbyname()和getaddrinfo()长时间阻塞:超过17秒。

  • 异​​步测试过程:
  • 为异步消息创建窗口
  • WSAAsyncGetHostByName()-在解析完成时接收消息
  • WSAAsyncSelect()-接收连接,准备发送和准备阅读的消息
  • SetTimeout()接收超时消息并弹出
  • 为窗口
  • 运行消息循环

    这也不是一件好事,因为WSAAsyncGetHostByName()“并非旨在提供多个名称的并行解析”(MSDN)。因此,即使从多个线程调用,它也可以执行顺序解析。这使线程按顺序运行,从而破坏了它们的目的。

    因此,我的问题是:阻止无法中断的调用或无法并行化的异步调用。

    在我看来,唯一的选择是在单独的线程中进行阻塞调用,并且如果一个线程的执行速度不够快,请使用TerminateThread()杀死它。

    还有什么比这更好的?

    最佳答案

    我不确定这是否适合您的模型,但是也许您可以一次解析主机名的IP地址(作为一种冷启动方式),然后对其进行缓存。

    这样,您就不必使用瓶颈的WSAAsyncGetHostByName,而只需测试HTTP通信即可。

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

    关于c++ - 多个名称的并发和可中断DNS名称解析似乎是不可能的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21734655/

    10-11 22:38
    查看更多