在不使用ping命令的情况下验证远程计算机的连接

时间:2009-06-24 07:18:54

标签: c++

c ++ / vc ++ / mfc中是否有任何方法,以便我可以验证远程计算机是否在网络上。我不想使用ping命令。我尝试使用WSAConnect方法,但是如果远程计算机不在网络上,则需要花费大量时间进行搜索。在那种情况下,应用windoe会长时间冻结。我需要替代方法来验证远程机器网络连接。 Plz帮助

6 个答案:

答案 0 :(得分:4)

您可以检查主机名是否存在以及DNS是否可以为其解析IP地址,但这不会告诉您它是否在线。为了确定它是否在线,您必须与主机交换数据。为此,主机必须正在侦听端口,并且必须发送某种响应。

通常,主机的最小公分母是ICMP数据包 - 也就是ping。您可以使用C ++编写自己的服务来发送这些UDP数据包,并检测回复。

某些主机和某些路由器禁用ICMP显示为“不可见”。如果您知道主机接受​​TCP端口上的连接,则可以尝试创建tcp套接字。例如,从shell中可以使用nc

进行测试
nc -z google.com 80
Connection to google.com 80 port [tcp/http] succeeded!

如果您执行原始套接字编程,您可以尝试通过,然后使用短暂超时调用select()来连接到主机。

答案 1 :(得分:2)

如果您不想阻止您的应用,请使用主题。

答案 2 :(得分:1)

你可以使用tracert命令 例如:

tracert -w 1000 192.168.0.77

答案 3 :(得分:1)

如果唯一的问题是调用WSAConnect会锁定您的UI,您可以尝试以非阻塞模式调用它。

在调用WSAConnect之前,调用WSAEventSelect将套接字设置为非阻塞模式。然后,您可以调用WSAAsyncSelect或WSAEventSelect来检查连接的状态。

MSDN关于WSAConnect的页面对非阻塞模式here有一些评论。

答案 4 :(得分:0)

您可以检查机器是否已连接到网络,但是没有尝试将数据传输到驻留在互联网上的站点,我认为没有办法检查该网络是否实际在线。例如,您的最终用户也可能连接到目前不在线的DSL路由器。

答案 5 :(得分:0)

你可以使用arping。

另外一些智能开关可以谈论附加主机。