网络编程实验报告局域网监控.docx
- 文档编号:9697388
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:313.62KB
网络编程实验报告局域网监控.docx
《网络编程实验报告局域网监控.docx》由会员分享,可在线阅读,更多相关《网络编程实验报告局域网监控.docx(21页珍藏版)》请在冰豆网上搜索。
网络编程实验报告局域网监控
课程设计报告
课程题目:
网络编程
设计题目:
局域网络监控系统设计
专业:
计算机科学与技术
班级:
计131
组员:
孔繁浩虞洲
学号:
1307130762
日期:
2016-05-20
信息工程学院计算机科学与技术
局域网络监控系统设计
1.课设目的
1.培养学生实验动手能力
2.深入了解和应用C#网络编程
3.熟悉局域网监控的原理和TCP协议通信的内容
2.题目要求
1自动显示局域网络主机上线信息和状态,实现存储和查询功能;
2可实现远程屏幕监视3台以上。
监视内容可以是全屏或选定区域;可保存所有或指定主机的屏幕,保存图像为JPG文件。
要求延迟小、屏幕效果清晰。
3.可参照商用软件PCAnywhere工具。
3.任务分组
孔繁浩:
1.同时监控三台电脑
2.保存图片为JPG文件
虞洲:
1.自动显示局域网其他在线主机ip
2.全屏或选定区域的屏幕监控
4.实验内容
1.设计思路
为能更好地实现软件功能的设计,从以下几方面入手来进行规划设计:
(1)采用客户端和控制台方式来设计软件,客户机和控制台依据功能要求分别设计软件,并分开安装。
(2)控制台软件采用C#下的TCP协议建立与客户端的通信连接,应包括多屏幕同时监控、显示在线计算机、监控范围设置、图片保存等功能。
也可以用一个文本文件或数据表按特定格式保存局域网内各工作站的IP地址。
(3)在对图像的处理方面,设定多线程对通过Socket传送来的数据保存为临时位图文件后在控制台界面里进行显示。
(4)尽可能对客户端运行的程序进行隐含运行,便于管理员的控制。
2.流程图(*)
服务端自动显示ip地址,可查询并存储
3.结构分析(部分关键代码)
多界面监控
tcpThread1=newThread(newThreadStart(getRemote1));
tcpThread1.Start();
tcpThread2=newThread(newThreadStart(getRemote2));
tcpThread2.Start();
tcpThread3=newThread(newThreadStart(getRemote3));
tcpThread3.Start();
tcpThread4=newThread(newThreadStart(getRemote4));
tcpThread4.Start();
...................................
图片保存JPG
privatevoidbutton1_Click(objectsender,EventArgse)
{
boolisSave=true;
SaveFileDialogsaveImageDialog=newSaveFileDialog();
saveImageDialog.Title="图片保存";
saveImageDialog.Filter=@"jpeg|*.jpg|bmp|*.bmp|gif|*.gif";
if(saveImageDialog.ShowDialog()==DialogResult.OK)
{
stringfileName=saveImageDialog.FileName.ToString();
if(fileName!
=""&&fileName!
=null)
{
stringfileExtName=fileName.Substring(fileName.LastIndexOf(".")+1).ToString();
System.Drawing.Imaging.ImageFormatimgformat=null;
if(fileExtName!
="")
{
switch(fileExtName)
{
case"jpg":
imgformat=System.Drawing.Imaging.ImageFormat.Jpeg;
break;
case"bmp":
imgformat=System.Drawing.Imaging.ImageFormat.Bmp;
break;
case"gif":
imgformat=System.Drawing.Imaging.ImageFormat.Gif;
break;
default:
MessageBox.Show("只能存取为:
jpg,bmp,gif格式");
isSave=false;
break;
}
}
ip显示
法一:
ping方法。
可以获取在线ip地址、主机名
privatevoidbutton6_Click(objectsender,EventArgse)
{
//获取本地机器名
string_myHostName=Dns.GetHostName();
//获取本机IP
string_myHostIP=Dns.GetHostEntry(_myHostName).AddressList[0].ToString();
this.textBox1.Text=_myHostIP;
//截取IP网段
stringipDuan=_myHostIP.Remove(_myHostIP.LastIndexOf('.'));
//枚举网段计算机
for(inti=1;i<=255;i++)
{
//WhenthePingCompletedeventisraised,
//thePingCompletedCallbackmethodiscalled.(_myPing_PingCompleted)
PingmyPing=newPing();//c#ping类对象myping
myPing.PingComplete+=newPingCompletedEventHandler(_myPing_PingCompleted);
stringpingIP=ipDuan+"."+i.ToString();
myPing.SendAsync(pingIP,1000,null);
/*
for循环:
“1000”
尝试以异步方式向指定IPAddress的计算机发送Internet控制消息协议(ICMP)回送消息,并从该计算机接收相应的ICMP回送答复消息。
此重载使您可以为操作指定一个超时值。
publicvoidSendAsync(
IPAddressaddress,//标识ICMP回送消息目标计算机的IPAddress。
inttimeout,//一个Int32值,指定(发送回送消息后)等待ICMP回送答复消息的最大毫秒数
objectuserToken//一个对象,此对象将被传递给异步操作完成后所调用的方法。
)
*/
}
}
privatevoid_myPing_PingCompleted(objectsender,PingCompletedEventArgse)
{
stringrs1=e.Reply.Address.ToString();
if(e.Reply.Status==IPStatus.Success)
{
//stringrs2=Dns.GetMacAddress(e.Reply.Address.ToString());
stringrs3=Dns.GetHostEntry(e.Reply.Address.ToString()).HostName;
stringitem="ip:
"+rs1+""+"主机名:
"+rs3;
this.listBox1.Items.Add(item);
//this.listBox1.Items.Add(e.Reply.Address.ToString());
}
}
法二:
nbtstat-aip命令可显示ip地址,用户组,MAC地址
引用:
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text.RegularExpressions;
privatevoidForm1_Load(objectsender,EventArgse)
{
txtIP.Text="192.168.1.101";//ip地址输入框
}
publicstaticboolIsIPAddress(stringip)
{
if(string.IsNullOrEmpty(ip)||ip.Length<7||ip.Length>15)returnfalse;
stringregformat=@"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$";
Regexregex=newRegex(regformat,RegexOptions.IgnoreCase);
returnregex.IsMatch(ip);
}
privatevoidbtnNbtstat_Click(objectsender,EventArgse)
{
txtInfo.Text=""; //文本信息显示框
stringipStr=txtIP.Text;
if(string.IsNullOrWhiteSpace(ipStr))
{
MessageBox.Show("IP不能为空!
");
}
if(!
IsIPAddress(ipStr))
{
MessageBox.Show("IP格式不正确!
");
return;
}
byte[]bs=newbyte[50]{0x0,0x00,0x0,0x10,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x43,0x4b,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x0,0x0,0x21,0x0,0x1};
byte[]Buf=newbyte[500];
byte[,]recv=newbyte[18,28];
stringstr="",strHost="",Group="",User="",strMac="";
intreceive,macline=0,usernum=0;
string[]domainuser=newstring[2];
domainuser[0]="";
domainuser[1]="";
try
{
IPEndPointsenderTest=newIPEndPoint(IPAddress.Any,0);
EndPointRemote=(EndPoint)senderTest;
IPEndPointipep=newIPEndPoint(IPAddress.Parse(ipStr),137);
Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
server.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout,3000);
server.SendTo(bs,bs.Length,SocketFlags.None,ipep);
receive=server.ReceiveFrom(Buf,refRemote);
server.Close();
if(receive>0)
{
recv=newbyte[18,(receive-56)%18];
for(intk=0;k<(receive-56)%18;k++)
{
for(intj=0;j<18;j++)
{
recv[j,k]=Buf[57+18*k+j];
}
}
for(intk=0;k<(receive-56)%18;k++)
{
str="";
if(System.Convert.ToString(recv[15,k],16)=="0"&&(System.Convert.ToString(recv[16,k],16)=="4"||System.Convert.ToString(recv[16,k],16)=="44"))
{
for(intj=0;j<15;j++)
{
str+=System.Convert.ToChar(recv[j,k]).ToString();
}
strHost=str.Trim();
}
if(System.Convert.ToString(recv[15,k],16)=="0"&&(System.Convert.ToString(recv[16,k],16)=="84"||System.Convert.ToString(recv[16,k],16).ToUpper()=="C4"))
{
for(intj=0;j<15;j++)
{
str+=System.Convert.ToChar(recv[j,k]).ToString();
}
Group=str.Trim();
}
if(System.Convert.ToString(recv[15,k],16)=="3"&&(System.Convert.ToString(recv[16,k],16)=="4"||System.Convert.ToString(recv[16,k],16)=="44"))
{
for(intj=0;j<15;j++)
{
str+=System.Convert.ToChar(recv[j,k]).ToString();
}
domainuser[usernum]=str.Trim();
usernum++;
}
if(System.Convert.ToString(recv[15,k],16)=="0"&&System.Convert.ToString(recv[16,k],16)=="0"&&System.Convert.ToString(recv[17,k],16)=="0")
{
macline=k;
for(inti=0;i<6;i++)
{
if(i<5)
{
strMac+=System.Convert.ToString(recv[i,macline],16).PadLeft(2,'0').ToUpper()+":
";
}
if(i==5)
{
strMac+=System.Convert.ToString(recv[i,macline],16).PadLeft(2,'0').ToUpper();
}
}
k=(receive-56)%18;
}
}
User=domainuser[1];
if(string.IsNullOrEmpty(domainuser[1])){User=domainuser[0];}
txtInfo.Text="主机:
"+strHost+Environment.NewLine+"用户组:
"+Group+Environment.NewLine+"用户:
"+User+Environment.NewLine+"MAC地址:
"+strMac;
}
}
catch(SocketExceptionex)
{
Console.WriteLine(ex.Message);
}
}
④ip查询
同上ping方法然后检测是否在线
privatevoid_myPing_PingCompleted1(objectsender,PingCompletedEventArgse)
{
if(e.Reply.Status==IPStatus.Success)
{
MessageBox.Show("在线");
}
else
{
MessageBox.Show("不在线");
}
}
⑤ip存储
直接存储为txt格式
privatevoidbutton4_Click(objectsender,EventArgse)
{
SaveFileDialogsave=newSaveFileDialog();
save.Filter=".txt|*.txt";
if(save.ShowDialog()==DialogResult.OK)
{
using(StreamWriterwriter=newStreamWriter(save.FileName))
{
foreach(stringiteminlistBox1.Items)
{
writer.WriteLine(item);
}
}
⑥选定区域监控
法一:
由服务端控制监控的屏幕大小
使用Socket类的Send方法将4个区域参数(tmptmpYtmpWidthtmpHeight)传送给客户端,应用示例:
byte[]bytes=newbyte[2048];stringmessage="测试数据发送";bytes=System.Text.Encoding.Unicode.GetBytes(message);
newSocket.Send(bytes,bytes.Length,SocketFlags.None);
法二:
由客户端端控制监控的屏幕大小
客户端调整监控自己的屏幕,再发送给服务端。
这种方法实现较为简单。
privatevoidcapture()
{
//创建显示器的DC
IntPtrdcScreen=CreateDC("DISPLAY",null,null,(IntPtr)null);
//由一个指定设备的句柄创建一个新的Graphics对象
Graphicsg1=Graphics.FromHdc(dcScreen);
inttmpWidth,tmpHeight;
//如果是全屏幕捕获
if(rdBtn1.Checked)
{
//Graphicsg1=this.CreateGraphics();//获得窗体图形对象
//ImageMyImage=newBitmap(this.ClientRectangle.Width,this.ClientRectangle.Height,g1);
//ImageMyImage=newBitmap(this.DesktopBounds.Width,this.DesktopBounds.Height,g1);
tmpWidth=Screen.PrimaryScreen.Bounds.Width;
tmpHeight=Screen.PrimaryScreen.Bounds.Height;
ImageMyImage=newBitmap(tmpWidth,tmpHeight,g1);
Graphicsg2=Graphics.FromImage(MyImage);//创建位图图形对象
IntPtrdc1=g1.GetHdc();//获得窗体的上下文设备
IntPtrdc2=g2.GetHdc();//获得位图文件的上下文设备
//写入到位图
BitBlt(dc2,0,0,tmpWidth,tmpHeight,dc1,0,0,13369376);
g1.ReleaseHdc(dc1);//释放窗体的上下文设备
g2.ReleaseHdc(dc2);//释放位图文件的上下文设备
//保存为jpeg文件
ms=newMemoryStream();
MyImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[]b=ms.GetBuffer();
ns.Write(b,0,b.Length);
ms.Flush();
}
else
{
inttmpX=Convert.ToInt32(textBox1.Text);
inttmpY=Convert.ToInt32(textBox2.Text);
tmpWidth=Convert.ToInt32(textBox3.Text);
tmpHeight=Convert.ToInt32(textBox4.Text);
inttmpRop=tmpWidth*tmpHeight;
ImageMyImage=newBitmap(tmpWidth,tmpHeight,g1);
Graphicsg2=Graphics.FromImage(MyImage);//创建位图图形对象
IntPtrdc1=g1.GetHdc();//获得窗体的上下文设备
IntPtrdc2=g2.GetHdc();//获得位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 实验 报告 局域网 监控
![提示](https://static.bdocx.com/images/bang_tan.gif)