版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告实验名称 :计算机网络课程设计学生姓名 : xxxxxxxxxxxxxxx专业: xxxxxxxxxxxxxxx班级: xxxxxxxxxxxxxxx学号: xxxxxxxxxxxxxxx指导教师 :xxxxxxxxxxxxxxx实验成绩 :实验地点 :实验时间 :2016 年 5月6 日一、实验目的与实验要求1、实验目的将书本上抽象的概念与具体实现技术结合,通过网络软件编程的实践,深入理解理论课上学习到的ARP、IP、TCP 等重要网络协议的原理,通过自己动手编程封装与发送这些数据包, 加深对网络协议的理解, 掌握协议帧的结构和工作原理及其对协议栈的贡献。2、实验要求网络课程设计包含
2、两个部分的内容:题目一是数据包的封装发送和解析(ARP/IP/TCP),要求使用 Winpcap 技术和 Socket 技术,根据 ARP/IP/TCP 帧的结构,封装数据包发送到局域网中。另外要捕获网络中的 TCP/IP/ARP 数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。题目二是从可选题目中选择一个,可选题目均是网络应用小程序,要求小组使用网络编程技术设计并实现一个网络应用程序, 加深对网络协议协的理解, 并锻炼网络编程能力。二、实验设备(环境)及要求1、实验硬件设备:计算机型号:联想ThinkPad T430u处理器型号: Intel i5 主频: 1.8Hz网卡型号:
3、(1)Realtek PCIe GBE (2)Broadcom 802.11n2、实验软件要求:操作系统: Windows10应用软件: Visual Studio 2015 Pro3、小组成员及分工:三、实验内容与步骤1、实验 1:数据包的封装发送和解析(ARP/IP/TCP)(1)实验内容1) 程序目标:根据 IP 帧的结构,封装 IP 数据包发送到局域网中。 并捕获网络中的IP 数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。2) 程序功能:以命令行形式运行在标准输出中显示捕获的 IP 报文的首部字段的内容。使用 winpcap 访问网卡,手动封装定义 IP 首部的数据结构填
4、充数据包,发送数据包,捕获数据包使用 winpcap,捕获 IP 数据包(2)主要步骤1) 总体设计:a. 获取设备列表并打印,打开所选择的适配器;b. 准备工作:定义 ip 相关的结构体、打开要存放结果的文件,设置过滤器,手写 ip 数据报(内容有无效的 MAC 源和目的地址, 和均为本机地址的 ip 源地址和目的地址,即发给自己一个 ip 报文),设置抓到数据报的解析和输出到文件的操作函数(解析 ip 报,打印并写入文件:报文的版本、协议、源和目的地址等)。c. 发包、抓包。d. 分析获取的数据。获取设备列表打开选择适配器过滤数据包解析数据包2) 具体实现:#define HAVE_REM
5、OTE#include "pcap.h"#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 首部 */typedef struct ip_headeru_char ver_ihl;/版本(4bits) +首部长度(4bits)u_
6、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(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_dat
7、a);/* 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;char packet_filter = "ip"/ 抓包类型pcap_dumper_t *dumpfil
8、e;/* 获取本机设备列表*/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("%d. %s", +i, d->name);if (d->description)printf(" (%s)n"
9、, 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 < 1 | inum > i)printf("n
10、Interface 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,/ 65535 保证能捕获到不同数据链路层上每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,/ 混杂模式1000,/ 读取超时时间NULL,/ 远程机器验证e
11、rrbuf) ) = NULL)/ 错误缓冲池fprintf(stderr,"nUnableto open the adapter. %s is not supported by WinPcapn",d->name);/* 释放设备列表*/pcap_freealldevs(alldevs);return -1;/* 打开堆文件 */dumpfile = pcap_dump_open(adhandle, "D:save.txt");if(dumpfile=NULL)fprintf(stderr,"nError opening output
12、filen");return -1;/* 检查数据链路层,只考虑以太网*/if(pcap_datalink(adhandle)!=DLT_EN10MB)fprintf(stderr, "nThis program works only on Ethernet networds.n");/* 释放设备列表*/pcap_freealldevs(alldevs);return -1;if(d->addresses != NULL)/获得接口第一个地址的掩码netmask = (struct sockaddr_in *)(d->addresses->ne
13、tmask)->sin_addr.S_un.S_addr;else/如果接口没有地址,那么我们假设一个C 类的掩码netmask=0xffffff;/编译过滤器if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)fprintf(stderr,"nUnable to compile the packet filter. Check the syntax.n");/释放设备列表pcap_freealldevs(alldevs);return -1;/设置过滤器if(pcap_setfilter
14、(adhandle,&fcode)<0)fprintf(stderr,"nError setting the filter.n");/释放设备列表pcap_freealldevs(alldevs);return -1;printf("nlistening on %s.n", d->description);/释放设备列表pcap_freealldevs(alldevs);/* 手写数据包 */u_char packet100;/* 假设在以太网上,设置MAC 的目的地址为1:1:1:1:1:1*/packet0=1;packet1=1
15、;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;packet11=2;/* 设置 ip 类型 */packet12=0x08;packet13=0x00;packet14=0x45;packet15=0x20;packet16=0x00;packet17=0x28;packet18=0xcb;packet19=0x16;packet20=0x00;packet21=0x00;packet22=0x2e;p
16、acket23=0x06;packet24=0x3e;packet25=0xe6;packet26=0xc0;/192packet27=0xa8;/168packet28=0x01;/1packet29=0x64;/100packet30=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 /* si
17、ze */) != 0)fprintf(stderr,"nError sending the packet: n", pcap_geterr(adhandle);return 0;elseprintf("Send successed");/* 开始捕获*/pcap_loop(adhandle, 0, packet_handler,(unsigned char *)dumpfile);/回调方式捕获数据包pcap_close(adhandle);return 0;/*每次捕获到数据包时,libpcap 都会自动调用这个回调函数*/void packet_h
18、andler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)struct tm *ltime;char timestr16;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);
19、strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);/打印数据包的时间戳和长度printf("%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(" 协议
20、 :%u",ih->proto);printf("首部校验和:%u",ih->crc);printf("目的地址:%u.%u.%u.%u",ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4);printf(" 源 地 址 ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4);:%u.%u.%u.%un",FILE
21、*fp;fp=fopen("D:jiexi.txt", "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->dadd
22、r.byte2,ih->daddr.byte3,ih->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)主要步骤(详细的实验步骤(系统/方法 /算法等),图文结合)1) 问题
23、定义:实现一个局域网内的文件传送与聊天的软件2) 需求分析:局域网内的文件传送应当具备以下功能:在线用户的及时发现和更新选择一对一或者一对多对话模式与选择用户进行聊天和文件传输用户下线通知与更新用户列表3) 系统设计:参考飞鸽传书的实现原理,总结设计方案如下:架构设计:本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;互相发现:本系统运行时启动局域网广播线程,发出包含主机名称、主机 IP 以及新加入标识符的广播表明自己新加入;用户列表:监听到其他用户的广播信息后更新列表,显示当前在线的用户名和用户 IP;更新列表:在系统退出时会广播本机信息,标识表明自己离开,其余在线用户接收到信息后
24、更新提示该用户下线;选择用户:可以单独选择或者多项选择用户列表中的用户;发送消息:选择用户后,在输入框中输入聊天信息,点击“发送”按钮系统会发送 UDP 数据包给对应用户的ip 地址,端口是 8011;接受消息:系统实时监听 8011 端口以接受不同用户发来的消息并展示在聊天窗口中;发送文件:选择指定用户,点击“发送文件”按钮,选择本机相应文件后,与目标用户建立TCP 连接,发送字节流。端口为8011;接受文件:监听到有TCP 连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进行接收,接收成功后再聊天窗口显示提示信息。4) 详细设计: 局域网用户列表的建立:软
25、件启动后定时的使用 UDP 协议向55这个广播地址发送广播包 ,端口设置为 8001。广播包内容包含主机名、 IP、标识符等信息,已启动软件的用户通过 8001 端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、 IP 地址等信息,从而局域网内的本系统用户都能建立起用户列表; 传送与接收信息:传送聊天信息时同样使用 UDP 协议,用户填写消息后点击按钮调用发送消息的函数, 然后通过 8011 端口发送 UDP 包。系统在启动时通过开辟新线程来监听 8011 端口,时刻监听发送到本机的信息。 发送文件:用户发送文件时建立一个带参数的线程来发送文件,调用相应
26、的 TCP 发送函数来发送文件,使用的是 8001 端口,由于协议不同因此与之前的广播并不冲突; 接收文件:软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立 TCP 连接的请求,之后提示用户收到文件选择是否接受,之后选择保存路径,进行接收。 用户离开:用户离线时发送一个离线广播包到 55 的 8001 端口,包中含有 LEAVE 的标识符,收到此广播包的用户, 根据包中的 IP 地址删除用户列表中相应的用户信息,并在聊天窗口显示“ XXX 用户已经离开”; 聊天记录保存:考虑到用户有保存聊天记录的需求,在聊天记录右侧点击“保存”
27、按钮,可以将当前聊天记录保存为 txt 文件到用户指定目录中。或点击“清空”,清空当前用户聊天记录。5) 具体实现:( C#)using System;using System.Collections.Generic;using System.ComponentModel;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 S
28、ystem.Threading.Tasks;using System.Windows.Forms;namespace IPMessagepublic partial class frmMain : Form/用户实体public class Userprivate string localname;/ 用户名public string localNameget return localname; set localname = value; private string localip;/ 用户 IPpublic string localIPget return localip; set lo
29、calip = 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(
30、localName);/ 输出对应的 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;/发送广播消息public void broadMessage()Socketsocket=
31、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();/ 标识符为
32、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);socke
33、t.Close();public void remove(User u)Userslist.Remove(u);this.rbChatContent.AppendText(" 用户: " + u.localName + " 离开 " + "n"); this.lbUser.Items.Remove(u.localName + "|" + u.localIP); ;/接收广播消息public void reciveBroad()Socket socket = newSocket(AddressFamily.Inter
34、Network,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 = new byte1024;s
35、ocket.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 > 1)bool ex
36、ist = false;if (Userslist!=null)foreach (User us in Userslist)if (us.localIP = sArray2)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.AppendText(" 新上线用户:&quo
37、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.localIP = sArray2;if (u != null)Userslist.Remove(u);this.rbChatContent.AppendText(" 用户: " + u.local
38、Name + " 离开"+"n");this.lbUser.Items.Remove(u.localName + "|" + u.localIP);Thread.Sleep(200);/ <summary>/ 通过 TcpClient 满足多用户发送文件/ </summary>/ <param name="ip"></param>public void tcpSend(List<string> ips)FileStream fs = new FileStr
39、eam(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, buffer.Length);ns.Write(buffer, 0, size);le
40、n += size;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;TcpClient client = listener.AcceptTcpClient();if (c
41、lient.Connected)this.rbChatContent.AppendText(" 连接成功 ");NetworkStream stream = client.GetStream();if (stream != null)DialogResult rs;rs = MessageBox.Show(" 你收到一个文件",MessageBoxButtons.YesNo);if (rs = DialogResult.Yes), 是否接收?"," 提示SaveFileDialog sfd = new SaveFileDialog()
42、;if(sfd.ShowDialog(this)=System.Windows.Forms.DialogResult.OK)string fileSavePath = sfd.FileName;/ 获得用户保存文件的路径FileStreamfs=newFileStream(fileSavePath,FileMode.Create, FileAccess.Write);byte buffer = new byte1024;while (size = stream.Read(buffer, 0, buffer.Length) > 0)fs.Write(buffer, 0, size);len
43、 += size;fs.Flush();stream.Flush();stream.Close();client.Close();this.rbChatContent.AppendText("文 件 接 受 成 功 "+fileSavePath + "n");catch(Exception ex)MessageBox.Show(ex.ToString();/ <summary>/ 主函数/ </summary> public frmMain()InitializeComponent();Thread seThread = new
44、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(this.listenMsg);rmThread.Start();/离开发送广播private void frmMain_FormClosing(object sender, FormClosing
45、EventArgs e)isBroad = false;this.broadMessage();Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPEndPoint iep = new IPEndPoint(IPAddress.Parse("55"), 8001);/ 设置 Broadcast 值为表示允许套接字发送广播消息,该值默认为不允许socket.SetSocketOption(SocketOptionLev
46、el.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(send
47、M, iep);/socket.SendTo(sendIP, iep);socket.Close();System.Environment.Exit(0);/文件路径public string filePath=null;private void btnSendFile_Click(object sender, EventArgs e)if (this.lbUser.SelectedItem=null)MessageBox.Show(" 请选择用户 ");elseOpenFileDialog file1 = new OpenFileDialog();if (file1.Sh
48、owDialog() = DialogResult.OK)List<string> ips = new List<string>();foreach (object obj in this.lbUser.SelectedItems)string getData = null;getData = obj.ToString();string arrays = null;arrays = getData.Split('|');filePath = file1.FileName;if (arrays1!=null)ips.Add(arrays1);this.rbChatContent.AppendText(" 发送文件: " + filePath + "n");/带参数的线程建立ThreadStart sta
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《课外阅读相变存储器》课件
- 语文:高考每日快餐(79套)
- 渴望苦难高考语文阅读理解
- 高三语文一轮复习(十八)文言文实词
- 教育培训机构销售专员工作总结
- 高中美术专业培养方案计划
- 酒店经营总结
- 汽车租赁公司前台工作总结
- 重庆市江津区2022-2023学年九年级上期期末化学试题
- 门诊护士工作总结
- 2025年初级会计职称《经济法基础》全真模拟及答案(解析3套)
- 《健康社区评价标准》
- 户外市场研究报告-魔镜洞察-202412
- 浙江省金华市金东区2023-2024学年九年级上学期语文期末试卷
- ISO 56001-2024《创新管理体系-要求》专业解读与应用实践指导材料之2:“1至3章:范围、术语和定义”(雷泽佳编制-2025B0)
- (2021)最高法民申5114号凯某建设工程合同纠纷案 指导
- 【9物(人)期末】安庆市宿松县2023-2024学年九年级上学期期末考试物理试题
- 导航通信一体化考核试卷
- 甘肃省会宁二中2025届高考仿真模拟数学试卷含解析
- 2024年未成年子女房产赠与协议
- 2024-2030年中国共模电感环形铁芯行业发展状况规划分析报告
评论
0/150
提交评论