考虑到用户输入的一系列IP地址(通过各种方式),我想确定哪些机器运行的软件可以与我交谈。
以下是基本流程:
Ping这些地址以查找可用的计算机
连接到可用计算机上的已知套接字
向成功建立的套接字发送消息
将响应与预期响应进行比较
步骤2-4对我来说很简单。实现.NET第一步的最佳方法是什么?
我正在查看System.Net.NetworkInformation.Ping类。我应该同时ping多个地址以加快进程吗?如果我一次ping一个地址并超时,可能需要永久。但是由于暂停时间很短,我可能会错过一些可用的机器。
即使我知道地址指向活动的计算机,有时ping似乎也会失败。如果请求被丢弃,我是否需要ping两次?
最重要的是,当我在网络电缆拔出时扫描大量地址时,Ping会在FreeUnmanagedResources()中抛出NullReferenceException。 !?
有关扫描一系列IP的最佳方法的指示吗?
答案 0 :(得分:4)
不要忘记在防火墙规则中拒绝ping的人的头痛。
我唯一的建议可能是一个问题:你必须做#1吗?
难道你不能简单地尝试连接到那个已知的套接字吗?成功连接到该插座可以一举两得:是的,主机在那里/有效,是的,已知套接字是打开的。
这种情况确实很适合多线程,在另一个线程上启动它,并等待它回来...
答案 1 :(得分:4)
由于并非所有机器都响应ping(取决于防火墙设置),如果可能,我建议跳过第1步。
如果您知道要连接的机器以响应ping,则ping类可以正常工作。它只发送1个数据包,因此如果它被丢弃则多次ping。另外,根据我的经验,如果主机无法访问,ping类通常会抛出异常而不是返回PingReply对象。
这是我建议的实施方式:
public bool
Ping (string host, int attempts, int timeout)
{
System.Net.NetworkInformation.Ping ping =
new System.Net.NetworkInformation.Ping ();
System.Net.NetworkInformation.PingReply pingReply;
for (int i = 0; i < attempts; i++)
{
try
{
pingReply = ping.Send (host, timeout);
// If there is a successful ping then return true.
if (pingReply != null &&
pingReply.Status == System.Net.NetworkInformation.IPStatus.Success)
return true;
}
catch
{
// Do nothing and let it try again until the attempts are exausted.
// Exceptions are thrown for normal ping failurs like address lookup
// failed. For this reason we are supressing errors.
}
}
// Return false if we can't successfully ping the server after several attempts.
return false;
}
答案 2 :(得分:0)
正如很多人提到Ping不是检测机器是否存活的最佳方法,如果绝对必须检测子网上的所有可用机器,您可以使用nmap扫描仪使用的一些技巧来检测可用机等。
您可以使用nmap -sP 192.168.2.1-200
将192.168.2.0扫描到192.168.2.255
答案 3 :(得分:-3)
听起来像是有人试图编写僵尸网络并扫描受感染PC的子网。
几乎没有理由“检测网络上的计算机”,让他们在他们想要的时候与他们交谈。