我需要快速测试一个列表~100网络服务器的连接性。很快就意味着对整群人来说大约是5秒。如果服务器在2-3秒内无法访问,则应该跳过服务器。如果没有互联网连接-测试应该很快失败- 2-3秒。它应该在XP (SP2)和up上运行。
我决定在一个单独的线程中为每个服务器运行一个测试过程。
同步测试过程执行以下操作:
gethostbyname()
或getaddrinfo()
(两者都尝试过)connect()
这是不好的:
异步测试过程:
WSAAsyncGetHostByName()
-当解析完成时接收消息WSAAsyncSelect()
-接收连接,准备发送和准备读的消息SetTimeout()
接收超时消息并弹出这个方法也没有用,因为WSAAsyncGetHostByName()
“不是为提供多个名称的并行解析而设计的”。因此,即使从多个线程调用,它也会执行顺序解析。这使得线程依次运行,从而违背了它们的目的。
因此,我的问题是:要么阻止不能中断的调用,要么阻止不能并行化的异步调用。
在我看来,唯一的选择是在单独的线程中执行阻塞调用,如果线程完成得不够快--用TerminateThread()
杀死它。
还有比这更好的吗?!
发布于 2014-02-12 21:10:46
我不确定这是否符合您的模型,但也许您可以将主机名的IP地址解析一次,作为一种冷开始的方式,然后缓存它们。
这样,您就可以避免使用WSAAsyncGetHostByName
,这是瓶颈,您只需要测试HTTP通信。
现在,假设您有理由怀疑某个主机自上次解析它以来已经更改了它的IP地址(例如,目标无法到达,或者连接被拒绝),那么您只需为该主机再次运行一个查询。
https://stackoverflow.com/questions/21734655
复制相似问题