计算机网络课程设计报告-报告_第1页
计算机网络课程设计报告-报告_第2页
计算机网络课程设计报告-报告_第3页
计算机网络课程设计报告-报告_第4页
计算机网络课程设计报告-报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z.实验报告实验名称:计算机网络课程设计学生: * 专业: * 班级: * *: * 指导教师: * 实验成绩:实验地点:实验时间: 2016 年 5 月 6 日-. z.一、实验目的与实验要求1、实验目的将书本上抽象的概念与具体实现技术结合,通过网络软件编程的实践,深入理解理论课上学习到的ARP、IP、TCP等重要网络协议的原理,通过自己动手编程封装与发送这些数据包,加深对网络协议的理解,掌握协议帧的构造和工作原理及其对协议栈的奉献。2、实验要求网络课程设计包含两个局部的容:题目一是数据包的封装发送和解析ARP/IP/TCP,要求使用Winpcap技术和Socket技术,根据ARP/I

2、P/TCP帧的构造,封装数据包发送到局域网中。另外要捕获网络中的TCP/IP/ARP数据包,解析数据包的容,并将结果显示,并同时写入日志文件。题目二是从可选题目中选择一个,可选题目均是网络应用小程序,要求小组使用网络编程技术设计并实现一个网络应用程序,加深对网络协议协的理解,并锻炼网络编程能力。二、实验设备环境及要求1、实验硬件设备:计算机型号:联想ThinkPad T430u处理器型号:Intel i5 主频:1.8Hz网卡型号:(1)Realtek PCIe GBE (2)Broad 802.11n2、实验软件要求:操作系统:Windows10应用软件:Visual Studio 2015

3、 Pro3、小组成员及分工:三、实验容与步骤1、实验1:数据包的封装发送和解析ARP/IP/TCP1实验容程序目标:根据IP帧的构造,封装IP数据包发送到局域网中。并捕获网络中的IP数据包,解析数据包的容,并将结果显示,并同时写入日志文件。程序功能:以命令行形式运行在标准输出中显示捕获的IP报文的首部字段的容。使用winpcap访问网卡,手动封装定义IP首部的数据构造填充数据包,发送数据包,捕获数据包使用winpcap,捕获IP数据包2主要步骤总体设计:获取设备列表并打印,翻开所选择的适配器;准备工作:定义ip相关的构造体、翻开要存放结果的文件,设置过滤器,手写ip数据报容有无效的MAC源和目

4、的地址,和均为本机地址的ip源地址和目的地址,即发给自己一个ip报文,设置抓到数据报的解析和输出到文件的操作函数解析ip报,打印并写入文件:报文的版本、协议、源和目的地址等。发包、抓包。分析获取的数据。具体实现:#define HAVE_REMOTE#include pcap.h#include remote-e*t.h#include stdio.h#include stdlib.h/*4字节的IP地址*/typedef struct ip_addressu_char byte1;u_char byte2;u_char byte3;u_char byte4;ip_address;/*IPv4

5、首部*/typedef struct ip_headeru_char ver_ihl; /版本4bits+首部长度4bitsu_char tos; /效劳类型u_short tlen; /总长类型u_short identification; /标识u_short flags_fo; /标志位+段偏移量u_char ttl; /存活时间u_char proto; /协议u_short crc; /首部校验和ip_address daddr; /目的地址ip_address saddr; /源地址u_int op_pad; /选项与填充ip_header;void packet_handler(

6、u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);/* packet handler 函数原型 */void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int main()pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;char errbufPCAP_ERRBUF_SIZE;u_int

7、 netmask;char packet_filter = ip; /抓包类型struct bpf_program fcode;pcap_dumper_t *dumpfile;/* 获取本机设备列表 */if (pcap_findalldevs_e*(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) = -1)fprintf(stderr,Error in pcap_findalldevs: %sn, errbuf);e*it(1);/* 打印适配器列表 */for(d=alldevs; d; d=d-ne*t)printf(%d. %s, +i, d-n

8、ame);if (d-description)printf( (%s)n, d-description);elseprintf( (No description available)n);if(i=0)printf(nNo interfaces found! Make sure WinPcap is installed.n);return -1;printf(Enter the interface number (1-%d):,i);scanf(%d, &inum);if(inum i)printf(nInterface number out of range.n);/* 释放设备列表 */p

9、cap_freealldevs(alldevs);return -1;/* 跳转到选中的适配器 */for(d=alldevs, i=0; ine*t, i+);/* 翻开设备 */if ( (adhandle= pcap_open(d-name, / 设备名 65536, / 65535保证能捕获到不同数据链路层上每个数据包的全部容PCAP_OPENFLAG_PROMISCUOUS, / 混杂模式1000, / 读取超时时间NULL, / 远程机器验证errbuf / 错误缓冲池) ) = NULL)fprintf(stderr,nUnable to open the adapter. %s

10、 is not supported by WinPcapn, d-name);/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;/* 翻开堆文件*/dumpfile = pcap_dump_open(adhandle, D:save.t*t);if(dumpfile=NULL)fprintf(stderr,nError opening output filen);return -1;/* 检查数据链路层,只考虑以太网 */if(pcap_datalink(adhandle)!=DLT_EN10MB)fprintf(stderr, nThis pro

11、gram works only on Ethernet networds.n);/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;if(d-addresses != NULL)/获得接口第一个地址的掩码netmask = (struct sockaddr_in *)(d-addresses-netmask)-sin_addr.S_un.S_addr;else/如果接口没有地址,则我们假设一个C类的掩码netmask=0*ffffff; /编译过滤器if(pcap_pile(adhandle,&fcode,packet_filter,1,netmas

12、k)0)fprintf(stderr,nUnable to pile the packet filter. Check the synta*.n);/释放设备列表pcap_freealldevs(alldevs);return -1;/设置过滤器if(pcap_setfilter(adhandle,&fcode)description);/释放设备列表pcap_freealldevs(alldevs);/*手写数据包*/u_char packet100;/*假设在以太网上,设置MAC的目的地址为1:1:1:1:1:1*/packet0=1;packet1=1;packet2=1;packet3

13、=1;packet4=1;packet5=1;/*设置MAC的源地址为2:2:2:2:2:2*/packet6=2;packet7=2;packet8=2;packet9=2;packet10=2;packet11=2;/*设置ip类型*/packet12=0*08;packet13=0*00;packet14=0*45;packet15=0*20;packet16=0*00;packet17=0*28;packet18=0*cb;packet19=0*16;packet20=0*00;packet21=0*00;packet22=0*2e;packet23=0*06;packet24=0*3

14、e;packet25=0*e6;packet26=0*c0;/192packet27=0*a8;/168packet28=0*01;/1packet29=0*64;/100packet30=0*c0;packet31=0*a8;packet32=0*01;packet33=0*64;packet34=0*8f;packet35=0*50;/*填充剩下的容*/for(i=36;its.tv_sec;ltime=localtime(&local_tv_sec);strftime( timestr, sizeof timestr, %H:%M:%S, ltime);/打印数据包的时间戳和长度prin

15、tf(%s,%.6d len:%dn, timestr, header-ts.tv_usec, header-len);/获得IP数据部的位置ih = (ip_header*)(pkt_data+14);/以太网头部长度/* 打印 IP 地址和 UDP 端口 */printf(版本+首部长度:%u,ih-ver_ihl);printf(协议:%u,ih-proto);printf(首部校验和:%u,ih-crc);printf(目的地址:%u.%u.%u.%u, ih-daddr.byte1,ih-daddr.byte2,ih-daddr.byte3,ih-daddr.byte4); prin

16、tf(源地址:%u.%u.%u.%un, ih-saddr.byte1,ih-saddr.byte2,ih-saddr.byte3,ih-saddr.byte4);FILE *fp;fp=fopen(D:jie*i.t*t, a+);fprintf(fp,解析结果:);fprintf(fp,版本+首部长度:%u,ih-ver_ihl);fprintf(fp,协议:%u,ih-proto);fprintf(fp,首部校验和:%u,ih-crc);fprintf(fp,目的地址:%u.%u.%u.%u, ih-daddr.byte1,ih-daddr.byte2,ih-daddr.byte3,ih

17、-daddr.byte4); fprintf(fp,源地址:%u.%u.%u.%un, ih-saddr.byte1,ih-saddr.byte2,ih-saddr.byte3,ih-saddr.byte4);fclose(fp);2、实验2:子网文件传送1实验容明确的实验容设计并实现一个局域网部的文件传送工具,使用TCP协议进展可靠文件传输。以图形界面运行,不同结点上文件自动同步2主要步骤详细的实验步骤系统/方法/算法等,图文结合问题定义:实现一个局域网的文件传送与聊天的软件需求分析:局域网的文件传送应当具备以下功能:在线用户的及时发现和更新选择一对一或者一对多对话模式与选择用户进展聊天和文

18、件传输用户下线通知与更新用户列表系统设计:参考飞鸽传书的实现原理,总结设计方案如下:架构设计:本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;互相发现:本系统运行时启动局域网播送线程,发出包含主机名称、主机IP以及新参加标识符的播送说明自己新参加;用户列表:监听到其他用户的播送信息后更新列表,显示当前在线的用户名和用户IP;更新列表:在系统退出时会播送本机信息,标识说明自己离开,其余在线用户接收到信息后更新提示该用户下线;选择用户:可以单独选择或者多项选择用户列表中的用户;发送消息:选择用户后,在输入框中输入聊天信息,点击发送按钮系统会发送UDP数据包给对应用户的ip地址,端口是8

19、011;承受消息:系统实时监听8011端口以承受不同用户发来的消息并展示在聊天窗口中;发送文件:选择指定用户,点击发送文件按钮,选择本机相应文件后,与目标用户建立TCP连接,发送字节流。端口为8011;承受文件:监听到有TCP连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进展接收,接收成功后再聊天窗口显示提示信息。详细设计:局域网用户列表的建立:软件启动后定时的使用UDP协议向这个播送地址发送播送包,端口设置为8001。播送包容包含主机名、IP、标识符等信息,已启动软件的用户通过8001端口收到此播送包后,就会在自己的用户列表中添加这个用户的用户名、IP地址

20、等信息,从而局域网的本系统用户都能建立起用户列表;传送与接收信息:传送聊天信息时同样使用UDP协议,用户填写消息后点击按钮调用发送消息的函数,然后通过8011端口发送UDP包。系统在启动时通过开辟新线程来监听8011端口,时刻监听发送到本机的信息。发送文件:用户发送文件时建立一个带参数的线程来发送文件,调用相应的TCP发送函数来发送文件,使用的是8001端口,由于协议不同因此与之前的播送并不冲突;接收文件:软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立TCP连接的请求,之后提示用户收到文件选择是否承受,之后选择保存路径,进展接收。用户离开:用户离线时发

21、送一个离线播送包到的8001端口,包中含有LEAVE的标识符,收到此播送包的用户,根据包中的IP地址删除用户列表中相应的用户信息,并在聊天窗口显示*用户已经离开;聊天记录保存:考虑到用户有保存聊天记录的需求,在聊天记录右侧点击保存按钮,可以将当前聊天记录保存为t*t文件到用户指定目录中。或点击清空,清空当前用户聊天记录。具体实现:C#using System;using System.Collections.Generic;using System.ponentModel;using System.Data;using System.Drawing;using System.IO;using

22、System.Linq;using System.Net;using System.Net.Sockets;using System.Te*t;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace IPMessage public partial class frmMain : Form /用户实体 public class User private string localname; /用户名 public string localName get return loc

23、alname; set localname = value; private string localip; /用户IP public string localIP get return localip; set localip = value; /用户数组声明 public static List Userslist = new List(); /获得本机名和本机IP public User getInfo() User u = new User(); string localName = Dns.GetHostName();/获取主机名 /Console.WriteLine(主机名:0,

24、localName); u.localName = localName; IPHostEntry localHost = Dns.GetHostEntry(localName); /输出对应的IP地址 IPAddress localIP = null; for (int i = 0; i 1) bool e*ist = false; if (Userslist!=null) foreach (User us in Userslist) if (us.localIP = sArray2) e*ist = true; break; if (e*ist = false & sArray0=NEW)

25、User u = new User(); u.localName = sArray1; u.localIP = sArray2; if (u != null) Userslist.Add(u); this.rbChatContent.AppendTe*t(新上线用户:+u.localName + n); this.lbUser.Items.Add(u.localName + | + u.localIP); Thread.Sleep(100); else if(sArray0 = LEAVE) User u = new User(); u.localName = sArray1; u.local

26、IP = sArray2; if (u != null) Userslist.Remove(u); this.rbChatContent.AppendTe*t(用户: + u.localName + 离开+n); this.lbUser.Items.Remove(u.localName + | + u.localIP); Thread.Sleep(200); / / 通过TcpClient满足多用户发送文件 / / public void tcpSend(List ips) FileStream fs = new FileStream(filePath, FileMode.Open); for

27、each(string ip in ips) TcpClient client = new TcpClient(); client.Connect(ip, 8001); NetworkStream ns = client.GetStream(); int size = 0; long len = 0; while (len fs.Length) byte buffer = new byte1024; size = fs.Read(buffer, 0, buffer.Length); ns.Write(buffer, 0, size); len += size; fs.Flush(); ns.F

28、lush(); fs.Close(); ns.Close(); / / 使用TcpClient接收文件 / public void RecevieFile() TcpListener listener = new TcpListener(IPAddress.Any, 8001); listener.Start(); while(true) try int size = 0; int len = 0; TcpClient client = listener.AcceptTcpClient(); if (client.Connected) this.rbChatContent.AppendTe*t

29、(连接成功); NetworkStream stream = client.GetStream(); if (stream != null) DialogResult rs; rs = MessageBo*.Show(你收到一个文件,是否接收?,提示,MessageBo*Buttons.YesNo); if (rs = DialogResult.Yes) SaveFileDialog sfd = new SaveFileDialog(); if (sfd.ShowDialog(this) = System.Windows.Forms.DialogResult.OK) string fileSa

30、vePath = sfd.FileName;/获得用户保存文件的路径 FileStream fs = new FileStream(fileSavePath, FileMode.Create, FileAccess.Write); byte buffer = new byte1024; while (size = stream.Read(buffer, 0, buffer.Length) 0) fs.Write(buffer, 0, size); len += size; fs.Flush(); stream.Flush(); stream.Close(); client.Close(); t

31、his.rbChatContent.AppendTe*t(文件承受成功 + fileSavePath + n); catch(E*ception e*) MessageBo*.Show(e*.ToString(); / / 主函数 / public frmMain() Initializeponent(); Thread seThread = new Thread(this.broadMessage); seThread.Start(); Thread reThread = new Thread(this.reciveBroad); reThread.Start(); Thread rfThr

32、ead = new Thread(this.RecevieFile); rfThread.Start(); Thread rmThread = new Thread(this.listenMsg); rmThread.Start(); /离开发送播送 private void frmMain_FormClosing(object sender, FormClosingEventArgs e) isBroad = false; this.broadMessage(); Socket socket = new Socket(AddressFamily.InterNetwork, SocketTyp

33、e.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(55), 8001); /设置Broadcast值为表示允许套接字发送播送消息,该值默认为不允许 socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); User u = getInfo(); /标识符为LEAVE string send = LEAVE + , + u.localName + , + u.loca

34、lIP; byte sendM = System.Te*t.Encoding.Unicode.GetBytes(send); /byte sendIP = System.Te*t.Encoding.Unicode.GetBytes(u.localIP); socket.SendTo(sendM, iep); /socket.SendTo(sendIP, iep); socket.Close(); System.Environment.E*it(0); /文件路径 public string filePath=null; private void btnSendFile_Click(object

35、 sender, EventArgs e) if (this.lbUser.SelectedItem=null) MessageBo*.Show(请选择用户); else OpenFileDialog file1 = new OpenFileDialog(); if (file1.ShowDialog() = DialogResult.OK) List ips = new List(); foreach (object obj in this.lbUser.SelectedItems) string getData = null; getData = obj.ToString(); strin

36、g arrays = null; arrays = getData.Split(|); filePath = file1.FileName; if (arrays1!=null) ips.Add(arrays1); this.rbChatContent.AppendTe*t(发送文件: + filePath + n); /带参数的线程建立 ThreadStart starter = delegate this.tcpSend(ips); ; new Thread(starter).Start(); public void SendMessage() if (this.tbSend.Te*t.T

37、rim() = String.Empty) MessageBo*.Show(请输入你的消息!); else if (this.lbUser.SelectedInde* = -1) MessageBo*.Show(请选择用户!); else foreach (object obj in lbUser.Items) string getdata = obj.ToString(); string array = getdata.Split(|); User u = new User(); u.localName = array0; u.localIP = array1; Socket socket

38、= new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(u.localIP), 8011); User lo = getInfo(); string send = lo.localName + | + lo.localIP + | + this.tbSend.Te*t; byte sendM = null; sendM = System.Te*t.Encoding.Unicode.GetBytes(s

39、end); /byte sendIP = System.Te*t.Encoding.Unicode.GetBytes(u.localIP); socket.SendTo(sendM, iep); this.rbChatContent.AppendTe*t(发给 + u.localName + : + this.tbSend.Te*t + n); /socket.SendTo(sendIP, iep); socket.Close(); this.tbSend.Te*t = ; this.tbSend.Focus(); this.tbSend.Select(0, 0); / / 发送事件 / /

40、/ private void btnSend_Click(object sender, EventArgs e) this.SendMessage(); /监听消息 public void listenMsg() Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 8011); socket.Bind(iep); EndPoint ep = (EndPoint)iep;

41、while (true) Byte getBytes = new byte1024; socket.ReceiveFrom(getBytes, ref ep); string getData = null; getData = System.Te*t.Encoding.Unicode.GetString(getBytes); getData = getData.TrimEnd(u0000); string sArray = getData.Split(|); if (sArray.Length 1) User u = new User(); u.localName = sArray0; u.l

42、ocalIP = sArray1; this.rbChatContent.AppendTe*t (来自 + u.localName + :+ sArray2+n); Thread.Sleep(200); private void btnSave_Click(object sender, EventArgs e) if (this.rbChatContent.Te*t=String.Empty) MessageBo*.Show(不能为空,提示); else saveFileDialog1.Filter = Te*t files (*.t*t)|*.t*t|All files (*.*)|*.*;

43、 saveFileDialog1.FilterInde* = 1; /saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() = DialogResult.OK) / Save the contents of the RichTe*tBo* into the file. rbChatContent.SaveFile(saveFileDialog1.FileName, RichTe*tBo*StreamType.PlainTe*t); MessageBo*.Show(文件已成功保存); private void btnClear_Click(object sender, EventArgs e) this.rbChatContent.Te*t = null; private void tbSend_Enter(object sender, EventArgs e) private void tbSend_KeyDown(object

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论