计算机网络课程设计_报告
- 格式:doc
- 大小:308.00 KB
- 文档页数:19
1
实 验 报 告
实验名称: 计算机网络课程设计
学生姓名: xxxxxxxxxxxxxxx
专 业: xxxxxxxxxxxxxxx
班 级: xxxxxxxxxxxxxxx
学 号: xxxxxxxxxxxxxxx
指导教师: xxxxxxxxxxxxxxx
实验成绩:
实验地点:
实验时间: 2016 年 5
月 6 日
2 一、实验目的与实验要求
1、实验目的
将书本上抽象的概念与具体实现技术结合,通过网络软件编程的实践,深入理解理论课上学习到的ARP、IP、TCP等重要网络协议的原理,通过自己动手编程封装与发送这些数据包,加深对网络协议的理解,掌握协议帧的结构和工作原理及其对协议栈的贡献。
2、实验要求
网络课程设计包含两个部分的内容:
题目一是数据包的封装发送和解析(ARP/IP/TCP),要求使用Winpcap技术和Socket技术,根据ARP/IP/TCP帧的结构,封装数据包发送到局域网中。另外要捕获网络中的TCP/IP/ARP数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。
题目二是从可选题目中选择一个,可选题目均是网络应用小程序,要求小组使用网络编程技术设计并实现一个网络应用程序,加深对网络协议协的理解,并锻炼网络编程能力。
二、实验设备(环境)及要求
1、实验硬件设备:
计算机型号:联想ThinkPad T430u
处理器型号:Intel i5 主频:
网卡型号:(1)Realtek PCIe GBE (2)Broadcom
3 2、实验软件要求:
操作系统:Windows10
应用软件:Visual Studio 2015 Pro
3、小组成员及分工:
三、实验内容与步骤
1、实验1:数据包的封装发送和解析(ARP/IP/TCP)
(1)实验内容
1) 程序目标:
根据IP帧的结构,封装IP数据包发送到局域网中。并捕获网络中的IP数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。
2) 程序功能:
以命令行形式运行
在标准输出中显示捕获的IP报文的首部字段的内容。
使用winpcap访问网卡,手动封装
定义IP首部的数据结构
填充数据包,发送数据包,捕获数据包
使用winpcap,捕获IP数据包
(2)主要步骤
1) 总体设计:
a. 获取设备列表并打印,打开所选择的适配器; v1.0
可编辑可修改
4 b. 准备工作:定义ip相关的结构体、打开要存放结果的文件,设置过滤器,手写ip数据报(内容有无效的MAC源和目的地址,和均为本机地址的ip源地址和目的地址,即发给自己一个ip报文),设置抓到数据报的解析和输出到文件的操作函数(解析ip报,打印并写入文件:报文的版本、协议、源和目的地址等)。
c. 发包、抓包。
d. 分析获取的数据。
2) 具体实现:
#define HAVE_REMOTE
#include ""
#include ""
#include ""
#include ""
/*4字节的IP地址*/
typedef struct ip_address{
u_char byte1;
5 u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;
/*IPv4首部*/
typedef struct ip_header{
u_char ver_ihl; %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (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("\nInterface number out of range.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
6 return -1;
}
/* 跳转到选中的适配器 */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* 打开设备 */
if ( (adhandle= pcap_open(d->name, %s is not supported by WinPcap\n",
d->name);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
/* 打开堆文件*/
dumpfile = pcap_dump_open(adhandle, "D:\\");
if(dumpfile==NULL)
{
fprintf(stderr,"\nError opening output file\n");
return -1;
}
/* 检查数据链路层,只考虑以太网 */
if(pcap_datalink(adhandle)!=DLT_EN10MB)
{
fprintf(stderr, "nThis program works only on Ethernet ");
/* 释放设备列表 */
7 pcap_freealldevs(alldevs);
return -1;
}
if(d->addresses != NULL)
Check the ");
.\n", d->description);
d len:%d\n", timestr, header->, header->len);
u.%u.%u]", ih->,ih->,ih->,ih->;
printf("源地址:[%u.%u.%u.%u]\n", ih->,ih->,ih->,ih->;
FILE *fp;
fp=fopen("D:\\", "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->,ih->,ih->,ih->;
fprintf(fp,"源地址:[%u.%u.%u.%u]\n", ih->,ih->,ih->,ih->;
fclose(fp);
}
v1.0 可编辑可修改
8 2、实验2:子网内文件传送
(1)实验内容
(明确的实验内容)
设计并实现一个局域网内部的文件传送工具,使用TCP协议进行可靠文件传输。以图形界面运行,不同结点上文件自动同步 (2)主要步骤
(详细的实验步骤(系统/方法/算法等),图文结合)
1) 问题定义:
实现一个局域网内的文件传送与聊天的软件
2) 需求分析:
局域网内的文件传送应当具备以下功能:
在线用户的及时发现和更新
选择一对一或者一对多对话模式
与选择用户进行聊天和文件传输
用户下线通知与更新用户列表
3) 系统设计:
参考飞鸽传书的实现原理,总结设计方案如下:
架构设计:本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;
互相发现:本系统运行时启动局域网广播线程,发出包含主机名称、主机IP以及新加入标识符的广播表明自己新加入;
用户列表:监听到其他用户的广播信息后更新列表,显示当前在线的用户名和用户IP;
更新列表:在系统退出时会广播本机信息,标识表明自己离开,其余在v1.0 可编辑可修改
9 线用户接收到信息后更新提示该用户下线;
选择用户:可以单独选择或者多项选择用户列表中的用户;
发送消息:选择用户后,在输入框中输入聊天信息,点击“发送”按钮系统会发送UDP数据包给对应用户的ip地址,端口是8011;
接受消息:系统实时监听8011端口以接受不同用户发来的消息并展示在聊天窗口中;
发送文件:选择指定用户,点击“发送文件”按钮,选择本机相应文件后,与目标用户建立TCP连接,发送字节流。端口为8011;
接受文件:监听到有TCP连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进行接收,接收成功后再聊天窗口显示提示信息。
4) 详细设计:
① 局域网用户列表的建立:软件启动后定时的使用UDP协议向这个广播地址发送广播包,端口设置为8001。广播包内容包含主机名、IP、标识符等信息,已启动软件的用户通过8001端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、IP地址等信息,从而局域网内的本系统用户都能建立起用户列表;
② 传送与接收信息:传送聊天信息时同样使用UDP协议,用户填写消息后点击按钮调用发送消息的函数,然后通过8011端口发送UDP包。系统在启动时通过开辟新线程来监听8011端口,时刻监听发送到本机的信息。
③ 发送文件:用户发送文件时建立一个带参数的线程来发送文件,调用相应的TCP发送函数来发送文件,使用的是8001端口,由于协议不同因此与之前的广播并不冲突;
④ 接收文件:软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立TCP连接的请求,之后提示用户收到文件选择是否接受,之后选择保存路径,进行接收。
⑤ 用户离开:用户离线时发送一个离线广播包到的8001端口,包中含有