版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WORD格式实验报告实验名称 :计算机网络课程设计学生* : *x专业: *x班级: *x学号: *x指导教师 :*x实验成绩 :实验地点 :实验时间 :2021年 5月6 日专业资料整理WORD格式一、实验目的与实验要求1、实验目的将书本上抽象的概念与具体实现技术结合,通过网络软件编程的实践,深入理解理论课上学习到的ARP、IP、TCP 等重要网络协议的原理,通过自己动手编程封装与发送这些数据包, 加深对网络协议的理解, 掌握协议帧的构造和工作原理及其对协议栈的奉献。2、实验要求网络课程设计包含两个局部的内容:题目一是数据包的封装发送和解析ARP/IP/TCP,要求使用 Winpcap 技术
2、和 Socket 技术,根据 ARP/IP/TCP 帧的构造,封装数据包发送到局域网中。另外要捕获网络中的 TCP/IP/ARP 数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。题目二是从可选题目中选择一个,可选题目均是网络应用小程序,要求小组使用网络编程技术设计并实现一个网络应用程序, 加深对网络协议协的理解, 并锻炼网络编程能力。二、实验设备环境及要求1、实验硬件设备:计算机型号:联想ThinkPad T430u处理器型号: Intel i5 主频: 1.8Hz网卡型号: (1)Realtek PCIe GBE (2)Broadcom 802.11n2、实验软件要求:专业资料整
3、理WORD格式操作系统: Windows10专业资料整理WORD格式应用软件: Visual Studio 2021 Pro3、小组成员及分工:三、实验内容与步骤1、实验 1:数据包的封装发送和解析ARP/IP/TCP1实验内容1) 程序目标:根据 IP 帧的构造,封装 IP 数据包发送到局域网中。 并捕获网络中的IP 数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。2) 程序功能:以命令行形式运行在标准输出中显示捕获的 IP 报文的首部字段的内容。使用 winpcap 访问网卡,手动封装定义 IP 首部的数据构造填充数据包,发送数据包,捕获数据包使用 winpcap,捕获 IP
4、数据包2主要步骤1) 总体设计:a. 获取设备列表并打印,翻开所选择的适配器;b. 准备工作:定义 ip 相关的构造体、翻开要存放结果的文件,设置过滤器,手写 ip 数据报内容有无效的 MAC 源和目的地址, 和均为本机地址的 ip 源地址和目的地址,即发给自己一个 ip 报文,设置抓到数据报的解析和输出到文件的操作函数解析 ip 报,打印并写入文件:报文的版本、协议、源和目专业资料整理WORD格式的地址等。c. 发包、抓包。d. 分析获取的数据。获取设备列表翻开选择适配器过滤数据包解析数据包2) 具体实现:#define HAVE_REMOTE#include "pcap.h&qu
5、ot;#include "remote-ext.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 首部 */专业资料整理WORD格式typedef struct ip_header专业资料整理WORD格式u_char ver_ihl;/版本4bits +首部长度4bits专业资料整理WOR
6、D格式u_char tos;/效劳类型专业资料整理WORD格式u_short tlen;/ 总长类型专业资料整理WORD格式u_short identification;/ 标识专业资料整理WORD格式u_short flags_fo;/标志位+段偏移量专业资料整理WORD格式u_char ttl;/ 存活时间u_char proto;/协议u_short crc;/首部校验和ip_address daddr;/目的地址ip_address saddr;/源地址u_int op_pad;/ 选项与填充ip_header;void packet_handler(u_char *param, co
7、nst 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 netmask;专业资料整理WORD
8、格式char packet_filter = "ip"/ 抓包类型专业资料整理WORD格式pcap_dumper_t *dumpfile;/* 获取本机设备列表*/if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) = -1)fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);exit(1);/* 打印适配器列表*/for(d=alldevs; d; d=d->next)printf("
9、%d. %s", +i, d->name);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)
10、;scanf("%d", &inum);if(inum < 1 | inum > i)专业资料整理WORD格式printf("nInterface number out of range.n");/* 释放设备列表*/pcap_freealldevs(alldevs);return -1;/* 跳转到选中的适配器*/for(d=alldevs, i=0; i< inum-1 ;d=d->next, i+);/* 翻开设备*/if ( (adhandle= pcap_open(d->name,/ 设备名65536,/
11、65535 保证能捕获到不同数据链路层上每个数据包的全部内容专业资料整理WORD格式PCAP_OPENFLAG_PROMISCUOUS,/ 混杂模式专业资料整理WORD格式1000,/ 读取超时时间专业资料整理WORD格式NULL,/ 远程机器验证专业资料整理WORD格式errbuf) ) = NULL)/ 错误缓冲池专业资料整理WORD格式fprintf(stderr,"nUnableto open the adapter. %s is not supported by WinPcapn",d->name);/* 释放设备列表*/pcap_freealldevs(a
12、lldevs);return -1;/* 翻开堆文件 */dumpfile = pcap_dump_open(adhandle, "D:save.txt");if(dumpfile=NULL)专业资料整理WORD格式fprintf(stderr,"nError opening output filen");return -1;/* 检查数据链路层,只考虑以太网*/if(pcap_datalink(adhandle)!=DLT_EN10MB)fprintf(stderr, "nThis program works only on Ethernet
13、 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=0xffffff;/编译过滤器if(pcap_compile(adhandle,&fcode,packet_filter,1,netm
14、ask)<0)fprintf(stderr,"nUnable to compile the packet filter. Check the syntax.n");/释放设备列表pcap_freealldevs(alldevs);return -1;/设置过滤器if(pcap_setfilter(adhandle,&fcode)<0)fprintf(stderr,"nError setting the filter.n");专业资料整理WORD格式/释放设备列表pcap_freealldevs(alldevs);return -1;p
15、rintf("nlistening on %s.n", d->description);/释放设备列表pcap_freealldevs(alldevs);/* 手写数据包 */u_char packet100;/* 假设在以太网上,设置MAC 的目的地址为1:1:1:1:1:1*/packet0=1;packet1=1;packet2=1;packet3=1;packet4=1;packet5=1;/* 设置 MAC 的源地址为2:2:2:2:2:2*/packet6=2;packet7=2;packet8=2;packet9=2;packet10=2;packet1
16、1=2;/* 设置 ip 类型 */packet12=0x08;packet13=0x00;packet14=0x45;专业资料整理WORD格式packet15=0x20;packet16=0x00;packet17=0x28;packet18=0xcb;packet19=0x16;packet20=0x00;packet21=0x00;packet22=0x2e;packet23=0x06;packet24=0x3e;packet25=0xe6;packet26=0xc0;/192packet27=0xa8;/168packet28=0x01;/1packet29=0x64;/100pack
17、et30=0xc0;packet31=0xa8;packet32=0x01;packet33=0x64;packet34=0x8f;packet35=0x50;/* 填充剩下的内容*/for(i=36;i<100;i+)packeti=i%256;/* 发送数据包 */if (pcap_sendpacket(adhandle, packet, 100 /* size */) != 0)专业资料整理WORD格式fprintf(stderr,"nError sending the packet: n", pcap_geterr(adhandle);return 0;els
18、eprintf("Send successed");/* 开场捕获*/pcap_loop(adhandle, 0, packet_handler,(unsigned char *)dumpfile);/回调方式捕获数据包pcap_close(adhandle);return 0;/*每次捕获到数据包时,libpcap 都会自动调用这个回调函数*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)struct tm *ltime;char ti
19、mestr16;ip_header *ih;u_int ip_len;time_t local_tv_sec;/保存数据包到文件中pcap_dump(u_char*)param, header, pkt_data);/* 将时间戳转换成可识别的格式*/local_tv_sec = header->ts.tv_sec;ltime=localtime(&local_tv_sec);专业资料整理WORD格式strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);/打印数据包的时间戳和长度printf("%
20、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);专业资料整理WORD格式printf("首部校验和:%u",ih->crc);专业资料整理WORD格式pri
21、ntf("目的地址:%u.%u.%u.%u",专业资料整理WORD格式ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4);专业资料整理WORD格式printf(" 源 地 址 ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4);:%u.%u.%u.%un",专业资料整理WORD格式FILE *fp;fp=fopen("D:jiexi.txt&q
22、uot;, "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-&g
23、t;daddr.byte4);fprintf(fp,"源地址:%u.%u.%u.%un",ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4);fclose(fp);专业资料整理WORD格式2、实验 2:子网内文件传送1实验内容明确的实验内容设计并实现一个局域网内部的文件传送工具,使用 TCP 协议进展可靠文件传输。以图形界面运行,不同结点上文件自动同步2主要步骤详细的实验步骤系统/方法 /算法等,图文结合1) 问题定义:实现一个局域网内的文件传送与聊天的软件2) 需求分析:
24、局域网内的文件传送应当具备以下功能:在线用户的及时发现和更新选择一对一或者一对多对话模式与选择用户进展聊天和文件传输用户下线通知与更新用户列表3) 系统设计:参考飞鸽传书的实现原理,总结设计方案如下:架构设计:本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;互相发现:本系统运行时启动局域网播送线程,发出包含主机名称、主机 IP 以及新参加标识符的播送说明自己新参加;用户列表:监听到其他用户的播送信息后更新列表,显示当前在线的用户名和用户 IP;更新列表:在系统退出时会播送本机信息,标识说明自己离开,其余在线用户接收到信息后更新提示该用户下线;选择用户:可以单独选择或者多项选择用户列
25、表中的用户;专业资料整理WORD格式发送消息:选择用户后,在输入框中输入聊天信息,点击“发送按钮系统会发送 UDP 数据包给对应用户的ip 地址,端口是 8011;承受消息:系统实时监听 8011 端口以承受不同用户发来的消息并展示在聊天窗口中;发送文件:选择指定用户,点击“发送文件按钮,选择本机相应文件后,与目标用户建立TCP 连接,发送字节流。端口为8011;承受文件:监听到有TCP 连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进展接收,接收成功后再聊天窗口显示提示信息。4) 详细设计: 局域网用户列表的建立:软件启动后定时的使用 UDP 协议向255
26、.255.255.255这个播送地址发送播送包 ,端口设置为 8001。播送包内容包含主机名、 IP、标识符等信息,已启动软件的用户通过 8001 端口收到此播送包后,就会在自己的用户列表中添加这个用户的用户名、 IP 地址等信息,从而局域网内的本系统用户都能建立起用户列表;传送与接收信息:传送聊天信息时同样使用 UDP 协议,用户填写消息后点击按钮调用发送消息的函数, 然后通过 8011 端口发送 UDP 包。系统在启动时通过开辟新线程来监听 8011 端口,时刻监听发送到本机的信息。 发送文件:用户发送文件时建立一个带参数的线程来发送文件,调用相应的 TCP 发送函数来发送文件,使用的是
27、8001 端口,由于协议不同因此与之前的播送并不冲突; 接收文件:软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立 TCP 连接的请求,之后提示用户收到文件选择是否承受,之后选择保存路径,进展接收。用户离开:用户离线时发送一个离线播送包到 55 的 8001 端口,包中含有 LEAVE 的标识符,收到此播送包的用户, 根据包中的 IP 地址删除用户列表中相应的用户信息,并在聊天窗口显示“ *X 用户已经离开; 聊天记录保存:考虑到用户有保存聊天记录的需求,在聊天记录右侧点击“保存按钮,可以将当前聊天记录保存为 txt 文件到用户
28、指定目录中。或点专业资料整理WORD格式击“清空,清空当前用户聊天记录。5) 具体实现: C#using System;using System.Collections.Generic;using SystemponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Task
29、s;using System.Windows.Forms;namespace IPMessagepublic partial class frmMain : Form/用户实体public class Userprivate string localname;/ 用户名public string localNameget return localname; set localname = value; 专业资料整理WORD格式private string localip;/ 用户 IPpublic string localIPget return localip; set localip =
30、value; /用户数组声明public static List<User> Userslist = new List<User>();/获得本机名和本机IPpublic User getInfo()User u = new User();string localName = Dns.GetHostName();/ 获取主机名/Console.WriteLine(" 主机名: 0", localName);u.localName = localName;IPHostEntry localHost = Dns.GetHostEntry(localNam
31、e);/ 输出对应的 IP 地址IPAddress localIP = null;for (int i = 0; i < localHost.AddressList.Length; i+)if (localHost.AddressListi.AddressFamily = AddressFamily.InterNetwork)localIP = localHost.AddressListi;break;u.localIP = localIP.ToString();return u;专业资料整理WORD格式/发送播送消息public void broadMessage()Socketsoc
32、ket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPoint iep = new IPEndPoint(IPAddress.Parse("55"), 8001);/ 设置 Broadcast 值为表示允许套接字发送播送消息,该值默认为不允许socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast,1);User u = getInfo();/ 标
33、识符为 NEWstring send = "NEW"+","+u.localName + "," + u.localIP;byte sendM = System.Text.Encoding.Unicode.GetBytes(send);/byte sendIP = System.Text.Encoding.Unicode.GetBytes(u.localIP);while (isBroad)socket.SendTo(sendM, iep);Thread.Sleep(200);/socket.SendTo(sendIP, iep);s
34、ocket.Close();public void remove(User u)Userslist.Remove(u);this.rbChatContent.AppendText(" 用户: " + u.localName + " 离开 " + "n"); this.lbUser.Items.Remove(u.localName + "|" + u.localIP); ;专业资料整理WORD格式/接收播送消息public void reciveBroad()Socket socket = newSocket(Add
35、ressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPoint iep = new IPEndPoint(IPAddress.Any, 8001);socket.Bind(iep);EndPoint ep = (EndPoint)iep;/System.Timers.Timer t = new System.Timers.Timer(1000); /t.Elapsed += new System.Timers.ElapsedEventHandler(theout); while (true)Byte getBytes
36、= new byte1024;socket.ReceiveFrom(getBytes, ref ep);string getData = System.Text.Encoding.Unicode.GetString(getBytes);getData = getData.TrimEnd('u0000');string sArray = getData.Split(',');/this.rbChatContent.AppendText(" 新上线用户:" + sArray1 + "n"); if (sArray.Length
37、 > 1)bool exist = false;if (Userslist!=null)foreach (User us in Userslist)if (us.localIP = sArray2)专业资料整理WORD格式exist = true;break;if (exist = false && sArray0="NEW")User u = new User();u.localName = sArray1;u.localIP = sArray2;if (u != null) Userslist.Add(u);this.rbChatContent.A
38、ppendText(" 新上线用户:"+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.localIP = sArray2;if (u != null)Userslist.Remove(u);this.rbChatContent.AppendText(
39、" 用户: " + u.localName + " 离开"+"n");this.lbUser.Items.Remove(u.localName + "|" + u.localIP);专业资料整理WORD格式Thread.Sleep(200);/ <summary>/ 通过 TcpClient 满足多用户发送文件/ </summary>/ <param name="ip"></param>public void tcpSend(List<str
40、ing> ips)FileStream fs = new FileStream(filePath, FileMode.Open);foreach(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, buff
41、er.Length);ns.Write(buffer, 0, size);len += size;专业资料整理WORD格式fs.Flush();ns.Flush();fs.Close();ns.Close();/ <summary>/ 使用 TcpClient 接收文件/ </summary>public void RecevieFile()TcpListener listener = new TcpListener(IPAddress.Any, 8001);listener.Start();while(true)tryint size = 0;int len = 0;
42、TcpClient client = listener.AcceptTcpClient();if (client.Connected)this.rbChatContent.AppendText(" 连接成功 ");NetworkStream stream = client.GetStream();专业资料整理WORD格式if (stream != null)DialogResult rs;专业资料整理WORD格式rs = MessageBox.Show(" 你收到一个文件",MessageBoxButtons.YesNo);if (rs = Dialog
43、Result.Yes), 是否接收?"," 提示专业资料整理WORD格式SaveFileDialog sfd = new SaveFileDialog();if(sfd.ShowDialog(this)=System.Windows.Forms.DialogResult.OK)string fileSavePath = sfd.FileName;/ 获得用户保存文件的路径FileStreamfs=newFileStream(fileSavePath,FileMode.Create, FileAccess.Write);byte buffer = new byte1024;w
44、hile (size = stream.Read(buffer, 0, buffer.Length) > 0)fs.Write(buffer, 0, size);len += size;fs.Flush();stream.Flush();stream.Close();client.Close();this.rbChatContent.AppendText("文 件 接 受 成 功 "+fileSavePath + "n");专业资料整理WORD格式catch(Exception ex)MessageBox.Show(ex.ToString();/
45、<summary>/ 主函数/ </summary> public frmMain()InitializeComponent();Thread seThread = new Thread(this.broadMessage); seThread.Start();Thread reThread = new Thread(this.reciveBroad);reThread.Start();Thread rfThread = new Thread(this.RecevieFile);rfThread.Start();Thread rmThread = new Thread(
46、this.listenMsg);rmThread.Start();专业资料整理WORD格式/离开发送播送private void frmMain_FormClosing(object sender, FormClosingEventArgs e)isBroad = false;this.broadMessage();Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPEndPoint iep = new IPEndPoint(IPAddress.Parse(&q
47、uot;55"), 8001);/ 设置 Broadcast 值为表示允许套接字发送播送消息,该值默认为不允许socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast,1);User u = getInfo();/ 标识符为LEAVEstring send = "LEAVE" + "," + u.localName + "," + u.localIP;byte sendM = System.Text.Encoding.Unicode.GetBytes(send);/byte sendIP = System.Text.Encoding.Unicode.GetBytes(u.localIP);socket.SendTo(sendM, iep);/socket.SendTo(sendIP, iep);socket.Close();System.Environment.Exit(0);/文件路径public string filePath=null;private void btnSendFile_Click(object sender, EventArgs e)专业资料整理WORD格
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- XX建筑工程有限公司材料会计岗位职责
- 电厂安全管理视频讲解
- 安全试验操作指南讲解
- 幼师学业与职业规划
- 士官职业发展指导方案
- HKICPA认证就业价值
- 生产安全预案分类解析讲解
- 职业规划评语集锦
- 2026年销售经理面试模拟题
- 2026年安全监测专业知识
- 河南省郑州市郑州枫杨外国语校2026届中考数学最后冲刺模拟试卷含解析
- DB32∕T 4825-2024 普通国省道数字化建设与应用技术规程
- DBJ53T-44-2021云南省建筑工程资料管理规程
- 鲁南制药就业协议书
- 海外出国劳务合同8篇
- 《宠物饲养管理》课件-宠物犬生殖系统解剖生理特点
- 贵州省遵义市(2024年-2025年小学六年级语文)统编版小升初模拟((上下)学期)试卷及答案
- 《中国心力衰竭诊断和治疗指南2024》解读(下)
- 侵袭性肺曲霉病课件
- 电梯维保人员奖惩制度
- 商务英语专业四级
评论
0/150
提交评论