我目前有代碼獲取一系列ip地址(例如192.168.1.101到192.168.1.110),並通過使用for循環來單獨ping它們。問題是這需要太長時間,特別是如果ping不成功。同時ping 10個IP地址是個好主意嗎?我嘗試過使用後臺工作人員,並且對使用多個後臺工作人員猶豫不決。 這是我的工作代碼:c#如何在同一時間ping多個ip地址
private void btnPingRange_Click(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
backgroundWorker1.RunWorkerAsync();
UpdateControls(true);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
UpdateControls(false);
}
static uint str2ip(string ip)
{
string[] octets = ip.Split('.');
uint x1 = (uint)(Convert.ToByte(octets[0]) << 24);
uint x2 = (uint)(Convert.ToByte(octets[1]) << 16);
uint x3 = (uint)(Convert.ToByte(octets[2]) << 8);
uint x4 = (uint)(Convert.ToByte(octets[3]));
return x1 + x2 + x3 + x4;
}
static string ip2str(uint ip)
{
string s1 = ((ip & 0xff000000) >> 24).ToString() + ".";
string s2 = ((ip & 0x00ff0000) >> 16).ToString() + ".";
string s3 = ((ip & 0x0000ff00) >> 8).ToString() + ".";
string s4 = (ip & 0x000000ff).ToString();
string ip2 = s1 + s2 + s3 + s4;
return ip2;
}
public string GetMacAddress(string ipAddress)
{
string macAddress = string.Empty;
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = "arp";
pProcess.StartInfo.Arguments = "-a " + ipAddress;
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.CreateNoWindow = true;
pProcess.Start();
string strOutput = pProcess.StandardOutput.ReadToEnd();
string[] substrings = strOutput.Split('-');
if (substrings.Length >= 8)
{
macAddress = substrings[3].Substring(Math.Max(0, substrings[3].Length - 2))
+ "-" + substrings[4] + "-" + substrings[5] + "-" + substrings[6]
+ "-" + substrings[7] + "-"
+ substrings[8].Substring(0, 2);
return macAddress;
}
else
{
return "not found";
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
uint startIP = str2ip(txtFrom.Text);
uint endIP = str2ip(txtTo.Text);
DataTable pingResults = new DataTable();
pingResults.Columns.Add("Date");
pingResults.Columns.Add("IP Address");
pingResults.Columns.Add("Mac Address");
pingResults.Columns.Add("Result");
//slow part
for (uint currentIP = startIP; currentIP <= endIP; currentIP++)
{
string thisIP = ip2str(currentIP);
Ping ping = new Ping();
PingReply pingReply = ping.Send(thisIP.ToString());
var message = (pingReply.Status == IPStatus.Success) ? "On" : "Off";
pingResults.Rows.Add(DateTime.Now.ToShortDateString(), thisIP.ToString(),GetMacAddress(thisIP), message.ToString());
}
dataGridView1.DataSource = pingResults;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void UpdateControls(bool isVisible)
{
if (isVisible)
{
panel1.Visible = true;
pictureBox1.Refresh();
pictureBox2.Refresh();
groupBox1.Enabled = false;
groupBox2.Enabled = false;
}
else
{
panel1.Visible = false;
groupBox1.Enabled = true;
groupBox2.Enabled = true;
}
}
每一個ping請求創建單獨的線程。 –
@HarshitShrivastava如果我想ping整個網絡,啓動254個線程會好嗎? –
也許是並聯循環? https://msdn.microsoft.com/en-us/library/ff963552.aspx –