zoukankan
html css js c++ java
c#初学日记:多线程扫描网络计算机
首先定义一个UpDataList,以后用于创建线程实例
public
delegate
void
UpDataList(
string
sIP,
string
sHostName);
定义一个名叫ping的class,用于计算机的扫描模块
public
class
ping
{
public
UpDataList ul;a
public
string
sIP;
//
接收传递过来的IP地址
public
string
sHostName;
//
向主进程传递计算机名
public
string
sMac;
//
向主进程传递远程主机MAC地址
public
string
sUser;
//
向主进程传递远程主机当前用户
public
string
sHDsize;
//
硬盘容量
public
string
sHDuse;
//
已用空间
public
string
sHDfree;
//
剩余空间
public
void
scan()
{
IPAddress myIP
=
IPAddress.Parse(sIP);
try
{
IPHostEntry myHost
=
Dns.GetHostByAddress(myIP);
//
根据IP获得主机名
sHostName
=
myHost.HostName.ToString();
}
catch
{
sHostName
=
""
;
}
if
(sHostName
==
""
)
sHostName
=
"
no
"
;
if
(ul
!=
null
)
ul(sIP,sHostName);
}
}
扫描数据写入listview中(这部分是在线程中调用的。其中写出时要用lock锁住listView1,不让其它线程写入)
void
UpDataMyList(
string
sIP,
string
sHostName)
{
//
写入扫描数据
if
(sHostName
!=
"
no
"
)
//
主机在线是就写入数据
{
lock
(
this
.listView1)
//
锁住listView1,保证在写入时的独占权
{
ListViewItem listViewItem
=
new
ListViewItem(
new
string
[]
{sHostName,sIP}
);
listView1.Items.Add(listViewItem);
listBox1.Items.Add(
"
扫描
"
+
sIP
+
"
完成
"
);
}
}
else
{
listBox1.Items.Add(sIP
+
"
不在线
"
);
}
}
其中的网段部分考虑以后可以用ini文件等提供,可以由用户自己设想要扫描的内容。现在我自己手工加了4个网段。由扫描10网段为例:
private
void
treeView1_AfterSelect(
object
sender, System.Windows.Forms.TreeViewEventArgs e)
{
if
(e.Node.Text.ToString()
==
"
扫描10网段
"
)
{
listView1.Items.Clear();
//
清空listView1
listBox1.Items.Clear();
//
清空listBox1
//
创建多个线程实例
int
min
=
1
;
int
max
=
254
;
//
min和max定义扫描的范围是192.168.10.1-192.168.10.254
string
Mask
=
"
192.168.10.
"
;
int
threadNum
=
max
-
min
+
1
;
Thread[] myThread
=
new
Thread[threadNum];
for
(
int
i
=
min;i
<=
max;
++
i)
{
try
{
int
k
=
max
-
i;
ping HostPing
=
new
ping();
//
创建一个ping的实例
HostPing.sIP
=
Mask
+
i.ToString();
//
获得一个IP
HostPing.ul
=
new
UpDataList(UpDataMyList);
//
向主线程传送IP地址
myThread[k]
=
new
Thread(
new
ThreadStart(HostPing.scan));
//
初始化一个线程的实例
myThread[k].Start();
}
catch
{
}
}
}
}
如上代码运行后能正常用多线程扫描10网段了。总算完成了一部分
忘记加上初始化listView1的代码了:
private
void
setListView()
{
//
以下为初始化listView1的代码
listView1.View
=
View.Details;
//
设置listView1的显示方式为Details
listView1.MultiSelect
=
false
;
//
禁止选中多行
listView1.Scrollable
=
true
;
//
显示内容超出范围时,允许显示滚动条
listView1.FullRowSelect
=
true
;
//
当项目选中时,同行所有子项都突出显示
listView1.GridLines
=
true
;
//
显示网格线
//
初始化表头
listView1.Columns.Add(
"
电脑名称
"
,
100
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
IP地址
"
,
150
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
MAC地址
"
,
150
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
当前用户
"
,
100
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
硬盘空间
"
,
100
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
已用空间
"
,
100
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
剩余空间
"
,
100
,HorizontalAlignment.Left);
listView1.Columns.Add(
"
扫描时间
"
,
100
,HorizontalAlignment.Left);
}
在form_load事件中调用setListView就可以了
查看全文
相关阅读:
EMIF接口的寻址问题
C6000系类的内联函数
C6000代码层面优化(一)
RHCE学习笔记
找出并关闭Ruby On Rails进程.
Rails4添加bootstrap支持
如何删除gnome3面板上的图标?
出现 ruby cannot load such file -- zlib 问题的解决方法
Debian安装软件时提示插入光盘
Debian7桌面屏蔽图标和右键菜单的解决方法。
原文地址:https://www.cnblogs.com/kokoliu/p/519517.html
最新文章
构建web应用之——maven创建以及SpringMVC配置
软件测试第三次作业主路径覆盖测试
软件测试第三次作业
JAVA并发体系-1-线程和任务
JAVA并发体系-1.1-终结任务或线程
JAVA并发体系-1.3-线程之间的协作
JAVA并发体系-2-锁机制
JAVA并发体系-3-并发容器
并发实现机制-2-互斥实现
并发实现机制-3-死锁和饥饿
热门文章
JAVA-Object
JAVA-Object
JAVA并发体系-1-线程和任务
STM32F401 外部中断误触发问题
初始IP协议
初识TCP协议
网络知识扫盲知识(一)
Ymodem协议说明
基于Ubuntu的ESP32平台搭建
基于IAR平台FreeRTOS移植
Copyright © 2011-2022 走看看