ping大量IP地址的最快方法
本文关键字:方法 地址 大量 IP ping | 更新日期: 2023-09-27 18:13:34
我有一个大的IP地址列表在一个数据表,我必须ping他们这么快,我使用了以下代码:
public bool PingIP(string IP)
{
bool result = false;
try
{
Ping ping = new Ping();
PingReply pingReply = ping.Send(IP);
if (pingReply.Status == IPStatus.Success)
result = true;
}
catch
{
result = false;
}
return result;
}
然后在while循环中调用它:
private void CheckNetworkState()
{
while (rowindexping > -1)
{
if (rowindexping == tbl_ClientInfo.Rows.Count)
{
rowindexping = -1;
return;
}
string ip = tbl_ClientInfo.Rows[rowindexping]["clientip"].ToString();
if (!PingIP(ip))
{
do something
}
rowindexping++;
Thread.Sleep(100);
}
}
因为我想在我的项目的后台做这项工作,我调用类在一个线程:
threadping = new Thread(CheckNetworkState);
threadping.IsBackground = true;
threadping.Start();
我的问题是,它需要这么多的时间,并不能在后台工作。我的意思是系统一直很忙,直到tbl_clientinfo中的所有IP地址都通过ping类。我希望系统检查所有行,因为我正在与我的项目的其他部分工作。
我做对了吗?
你的代码在一个线程上运行所有的代码;您没有使用多个线程。还有,为什么这里有一个Thread.Sleep
?
尝试以下操作:
- 查询数据库获取
all
ip - 在一个循环中,启动一个新线程,为每个 IP地址运行
PingIP
注意:您也可以在每次从数据库获得新行时启动一个新线程
示例: static void Main(string[] args)
{
// get the IPs from the database so you can iterate over them
List<string> ips = new List<string>()
{
"google.com",
"127.0.0.1",
"stackoverflow.com"
};
foreach (var ip in ips)
{
// See http://stackoverflow.com/questions/4744630/unexpected-behaviour-for-threadpool-queueuserworkitem
// for reason to use another variable in the loop
string loopIp = ip;
WaitCallback func = delegate(object state)
{
if (PingIP(loopIp))
{
Console.WriteLine("Ping Success");
}
else
{
Console.WriteLine("Ping Failed");
}
};
ThreadPool.QueueUserWorkItem(func);
}
Console.ReadLine();
}
public static bool PingIP(string IP)
{
bool result = false;
try
{
Ping ping = new Ping();
PingReply pingReply = ping.Send(IP);
if (pingReply.Status == IPStatus.Success)
result = true;
}
catch
{
result = false;
}
return result;
}
我要做的是在后台运行一个单独的多线程守护进程,执行ping,并将结果放入数据库中。有一个页面,稍后通过AJAX加载结果。
考虑对ping实用程序进行系统调用。诚然,它不是托管代码,但是ping针对您的特定任务进行了很好的优化,并将您的问题简化为单个调用,然后处理基于文本的结果列表。
你可以使用powershell
private string resultat(string s)
{
Runspace space = RunspaceFactory.CreateRunspace();
space.Open();
Pipeline pipeline = space.CreatePipeline();
pipeline.Commands.AddScript(s);
pipeline.Commands.Add("Out-String");
Collection<PSObject> results = pipeline.Invoke();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
stringBuilder.AppendLine(obj.ToString());
}
return stringBuilder.ToString();
}
然后使用resultat("ping -l 10 -n 2 " + your_ip);