📄 frm-onlineip.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading; //线程命名空间
using System.Net; //网络命名空间
//思想为获取IP地址的主机名与信息.如发生异常,则说明主机不可到达(关机)
namespace 计算机及IP管理
{
//定义托管
public delegate void UpdateList(ListViewItem listviewitem);
public partial class frm_OnLineIP : Form
{
UserCls MyCls = new UserCls();
ListViewItem listviewitem; //清空listView1的项
DateTime StartTime; //获取当前时间
public frm_OnLineIP()
{
InitializeComponent();
}
//查询按钮,利用线程进扫描网内的IP,注释掉的部分代码用的是单线程,现在用多线程来实现
private void btnFind_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
txtTime.Text = "0秒";
if (!MyCls.IsInteger(txtStart.Text) || Convert.ToInt32(txtStart.Text.Trim()) > 255 || Convert.ToInt32(txtStart.Text.Trim()) < 0)
{
MessageBox.Show("请输入数字且大于0不大于255", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtStart.Focus();
return;
}
if (!MyCls.IsInteger(txtEnd.Text) || Convert.ToInt32(txtEnd.Text.Trim()) > 255 || Convert.ToInt32(txtEnd.Text.Trim()) < 0)
{
MessageBox.Show("请输入数字且大于0不大于255", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtEnd.Focus();
return;
}
/*
//Thread 类: 创建并控制线程
Thread thScan = new Thread(new ThreadStart(ScanTarget));
//Thread.Start 方法:启动线程
thScan.Start();
*/
string strIPaddress = txtNetWork.Text + "."; //或取前24位的IP地址
int Min = Int32.Parse(txtStart.Text);
int Max = Int32.Parse(txtEnd.Text);
if (Min > Max)
MessageBox.Show("终止地止必须大于启始地址", "警告"); //比较开始地址与接束地址,不允许终止地止必须小于启始地址
else
{
//判断输入的IP地址区间是否合法
int _ThreadNum = Max - Min + 1;
Thread[] mythread = new Thread[_ThreadNum]; //创建一个多个Thread实例
progressBarX1.Minimum = Min;
progressBarX1.Maximum = Max + 1;
progressBarX1.Value = Min;
StartTime = DateTime.Now;
int i;
for (i = Min; i <= Max; i++)
{
int k = Max - i;
PingCls HostPing = new PingCls(); //创建一个PingCls实例
HostPing.ip = strIPaddress + i.ToString();
HostPing.ul = new UpdateList(UpdateMyList);//使用委托,调用方法
HostPing.listviewitem = listviewitem;
//向这个ping实例中传递IP地址字符串
mythread[k] = new Thread(new ThreadStart(HostPing.scan)); //初始化一个线程实例
mythread[k].Start(); //启动线程
}
}
}
//页面载入
private void frm_OnLineIP_Load(object sender, EventArgs e)
{
MyCls.GetDataToComboBox("select DISTINCT network from t_switch where network <>''", txtNetWork, "t_switch", "network", "network");
txtNetWork.Text = "192.168.8";
//如果没有此句话在调用线程时会发生错误,原因是ScanTarget()函数中用到了WINDOWS控件
CheckForIllegalCrossThreadCalls = false;
}
//对网内IP扫描
private void ScanTarget()
{
string strIPaddress = txtNetWork.Text + "."; //或取前24位的IP地址
int start = Int32.Parse(txtStart.Text);
int end = Int32.Parse(txtEnd.Text);
if (start > end)
MessageBox.Show("终止地止必须大于启始地址", "警告"); //比较开始地址与接束地址,不允许终止地止必须小于启始地址
else
{
progressBarX1.Minimum = start;
progressBarX1.Maximum = end+1;
StartTime = DateTime.Now;
for (int i = start; i <= end; i++)
{
string strscanip = strIPaddress + i.ToString();//构造IP地址
IPAddress sacanip = IPAddress.Parse(strscanip);//转换成IP地址
listviewitem = new ListViewItem(strscanip, 0);//在ListViewItem添加IP地址
try
{
IPHostEntry hostinfo = Dns.GetHostByAddress(sacanip); //根据ip地址或取主机的DNS信息
string hostname = hostinfo.HostName.ToString(); //或取主机名
listviewitem.SubItems.Add(hostname); //在ListViewItem添加主机名
listviewitem.SubItems.Add("可知");
listviewitem.SubItems.Add("可到达");
}
catch (Exception ew)
{
listviewitem.SubItems.Add("检测不到");
listviewitem.SubItems.Add("未知");
listviewitem.SubItems.Add("不可到达");
// string strError = string.Format("ERROR:{0}", ew.Message);
// MessageBox.Show(strError, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
listView1.Items.Add(listviewitem); //将项加入listView1
progressBarX1.Value = i;
}
DateTime EndTime = DateTime.Now;
TimeSpan Ts = EndTime - StartTime;
txtTime.Text = Ts.Seconds.ToString() + "秒";
MessageBox.Show("扫描完毕", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//定义 的方法,通过委托来调用。
void UpdateMyList(ListViewItem listviewitem)
{
lock (listView1)
{
listView1.Items.Add(listviewitem);
if (progressBarX1.Value != progressBarX1.Maximum)
{
progressBarX1.Value++;
}
if (progressBarX1.Value == progressBarX1.Maximum)
{
MessageBox.Show("成功完成检测!", "提示");
DateTime EndTime = DateTime.Now;
TimeSpan ts = EndTime - StartTime;
txtTime.Text = ts.Seconds.ToString() + "秒";//显示扫描计算机所需要的时间
progressBarX1.Value = progressBarX1.Minimum;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -