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

C++ 在不使用ping命令的情况下验证远程计算机的连接,c++,C++,在c++/vc++/mfc中是否有任何方法可以验证远程计算机是否在网络上。我不想使用ping命令。我尝试使用WSAConnect方法,但如果远程计算机不在网络上,则搜索会花费大量时间。在这种情况下,应用程序windoe会长时间冻结。我需要另一种方法来验证远程计算机网络连接。Plz帮助您可以使用tracert命令 例如: tracert-w 1000 192.168.0.77您可以使用tracert命令 例如: tracert-w 1000 192.168.0.77您可以检查机器是否连接到网络,但

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

您可以使用tracert命令 例如:


tracert-w 1000 192.168.0.77

您可以使用tracert命令 例如:


tracert-w 1000 192.168.0.77

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

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

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

通常,主机的最低公分母是ICMP数据包,即ping。您可以在C++中编写自己的服务来发送这些UDP包,并检测一个答复。p> 某些主机和路由器禁用ICMP,使其看起来“不可见”。如果知道主机接受TCP端口上的连接,则可以尝试创建TCP套接字。例如,可以从shell使用nc进行测试

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

如果执行原始套接字编程,则可以尝试通过连接到主机,然后在短时间内调用select()

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

通常,主机的最低公分母是ICMP数据包,即ping。您可以在C++中编写自己的服务来发送这些UDP包,并检测一个答复。p> 某些主机和路由器禁用ICMP,使其看起来“不可见”。如果知道主机接受TCP端口上的连接,则可以尝试创建TCP套接字。例如,可以从shell使用nc进行测试

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

如果执行原始套接字编程,则可以尝试通过连接到主机,然后在短时间内调用select()

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

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


MSDN关于WSA连接的页面上有一些关于非阻塞模式的注释。

如果唯一的问题是调用WSA连接会锁定您的UI,您可以尝试在非阻塞模式下调用它

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


MSDN在WSA连接上的页面上有一些关于非阻塞模式的注释。

如果你不想让你的应用程序阻塞,请使用线程。

如果你不想让你的应用程序阻塞,请使用线程。

你可以使用arping


还有一些智能交换机可以谈论连接的主机。

您可以使用ARP


还有一些智能交换机可以谈论连接的主机。

出于好奇,为什么不在这种情况下使用ping?ping是ICMP消息,可以被防火墙和代理阻止。可以连接,但没有ping响应。出于好奇,为什么不在这种情况下使用ping呢?ping是ICMP消息,可以被防火墙和代理阻止。可能存在连接且没有ping响应。