计算机网络课程设计报告Word文件下载.docx
《计算机网络课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
计算机型号:
联想ThinkPadT430u
处理器型号:
Inteli5主频:
网卡型号:
(1)RealtekPCIeGBE
(2)Broadcom
2、实验软件要求:
操作系统:
Windows10
应用软件:
VisualStudio2015Pro
3、小组成员及分工:
三、实验内容与步骤
1、实验1:
数据包的封装发送和解析(ARP/IP/TCP)
(1)实验内容
1)程序目标:
根据IP帧的结构,封装IP数据包发送到局域网中。
并捕获网络中的IP数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。
2)程序功能:
以命令行形式运行
在标准输出中显示捕获的IP报文的首部字段的内容。
使用winpcap访问网卡,手动封装
定义IP首部的数据结构
填充数据包,发送数据包,捕获数据包
使用winpcap,捕获IP数据包
(2)主要步骤
1)总体设计:
a.获取设备列表并打印,打开所选择的适配器;
b.准备工作:
定义ip相关的结构体、打开要存放结果的文件,设置过滤器,手写ip数据报(内容有无效的MAC源和目的地址,和均为本机地址的ip源地址和目的地址,即发给自己一个ip报文),设置抓到数据报的解析和输出到文件的操作函数(解析ip报,打印并写入文件:
报文的版本、协议、源和目的地址等)。
c.发包、抓包。
d.分析获取的数据。
2)
具体实现:
#defineHAVE_REMOTE
#include"
"
/*4字节的IP地址*/
typedefstructip_address{
u_charbyte1;
u_charbyte2;
u_charbyte3;
u_charbyte4;
}ip_address;
/*IPv4首部*/
typedefstructip_header{
u_charver_ihl;
%s"
++i,d->
name);
if(d->
description)
printf("
(%s)\n"
d->
description);
else
(Nodescriptionavailable)\n"
);
}
if(i==0)
{
printf("
\nNointerfacesfound!
MakesureWinPcapisinstalled.\n"
return-1;
printf("
Entertheinterfacenumber(1-%d):
i);
scanf("
%d"
&
inum);
if(inum<
1||inum>
i)
\nInterfacenumberoutofrange.\n"
/*释放设备列表*/
pcap_freealldevs(alldevs);
/*跳转到选中的适配器*/
for(d=alldevs,i=0;
i<
inum-1;
d=d->
next,i++);
/*打开设备*/
if((adhandle=pcap_open(d->
name,%sisnotsupportedbyWinPcap\n"
/*打开堆文件*/
dumpfile=pcap_dump_open(adhandle,"
D:
\\"
if(dumpfile==NULL)
fprintf(stderr,"
\nErroropeningoutputfile\n"
/*检查数据链路层,只考虑以太网*/
if(pcap_datalink(adhandle)!
=DLT_EN10MB)
fprintf(stderr,"
nThisprogramworksonlyonEthernet"
if(d->
addresses!
=NULL)
Checkthe"
.\n"
dlen:
%d\n"
timestr,header->
header->
len);
u.%u.%u]"
ih->
ih->
;
源地址:
[%u.%u.%u.%u]\n"
FILE*fp;
fp=fopen("
"
a+"
fprintf(fp,"
解析结果:
版本+首部长度:
[%u]"
ver_ihl);
协议:
proto);
首部校验和:
crc);
目的地址:
[%u.%u.%u.%u]"
fclose(fp);
}
2、实验2:
子网内文件传送
(明确的实验内容)
设计并实现一个局域网内部的文件传送工具,使用TCP协议进行可靠文件传输。
以图形界面运行,不同结点上文件自动同步
(详细的实验步骤(系统/方法/算法等),图文结合)
1)问题定义:
实现一个局域网内的文件传送与聊天的软件
2)需求分析:
局域网内的文件传送应当具备以下功能:
在线用户的及时发现和更新
选择一对一或者一对多对话模式
与选择用户进行聊天和文件传输
用户下线通知与更新用户列表
3)系统设计:
参考飞鸽传书的实现原理,总结设计方案如下:
架构设计:
本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;
互相发现:
本系统运行时启动局域网广播线程,发出包含主机名称、主机IP以及新加入标识符的广播表明自己新加入;
用户列表:
监听到其他用户的广播信息后更新列表,显示当前在线的用户名和用户IP;
更新列表:
在系统退出时会广播本机信息,标识表明自己离开,其余在线用户接收到信息后更新提示该用户下线;
选择用户:
可以单独选择或者多项选择用户列表中的用户;
发送消息:
选择用户后,在输入框中输入聊天信息,点击“发送”按钮系统会发送UDP数据包给对应用户的ip地址,端口是8011;
接受消息:
系统实时监听8011端口以接受不同用户发来的消息并展示在聊天窗口中;
发送文件:
选择指定用户,点击“发送文件”按钮,选择本机相应文件后,与目标用户建立TCP连接,发送字节流。
端口为8011;
接受文件:
监听到有TCP连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进行接收,接收成功后再聊天窗口显示提示信息。
4)详细设计:
1 局域网用户列表的建立:
软件启动后定时的使用UDP协议向这个广播地址发送广播包,端口设置为8001。
广播包内容包含主机名、IP、标识符等信息,已启动软件的用户通过8001端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、IP地址等信息,从而局域网内的本系统用户都能建立起用户列表;
2 传送与接收信息:
传送聊天信息时同样使用UDP协议,用户填写消息后点击按钮调用发送消息的函数,然后通过8011端口发送UDP包。
系统在启动时通过开辟新线程来监听8011端口,时刻监听发送到本机的信息。
3 发送文件:
用户发送文件时建立一个带参数的线程来发送文件,调用相应的TCP发送函数来发送文件,使用的是8001端口,由于协议不同因此与之前的广播并不冲突;
4 接收文件:
软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立TCP连接的请求,之后提示用户收到文件选择是否接受,之后选择保存路径,进行接收。
5 用户离开:
用户离线时发送一个离线广播包到的8001端口,包中含有LEAVE的标识符,收到此广播包的用户,根据包中的IP地址删除用户列表中相应的用户信息,并在聊天窗口显示“XXX用户已经离开”;
6 聊天记录保存:
考虑到用户有保存聊天记录的需求,在聊天记录右侧点击“保存”按钮,可以将当前聊天记录保存为txt文件到用户指定目录中。
或点击“清空”,清空当前用户聊天记录。
5)具体实现:
(C#)
usingSystem;
using;
usingIPMessage
{
publicpartialclassfrmMain:
Form
ddressFamily==
localIP=[i];
break;
=();
returnu;
tart();
publicvoidSendMessage()
if==
("
请输入你的消息!
elseif==-1)
("
请选择用户!
else
foreach(objectobjin
stringgetdata=();
string[]array=('
|'
Useru=newUser();
=array[0];
=array[1];
Socketsocket=newSocket,,;
IPEndPointiep=newIPEndPoint,8011);
Userlo=getInfo();
stringsend=+"
|"
++"
+byte[]sendM=null;
sendM=xt)|*.txt|Allfiles(*.*)|*.*"
=1;
;
文件已成功保存"
privatevoidbtnClear_Click(objectsender,EventArgse)
=null;
privatevoidtbSend_Enter(objectsender,EventArgse)
privatevoidtbSend_KeyDown(objectsender,KeyEventArgse)
();
四:
实验结果与分析
实验一
结果
运行程序后,命令窗口首先列出本地网卡列表,在本机测试时,检测出5个网卡,其中序号为3的网卡为以太网卡,序号为4的网卡为无线网卡。
图1-1设备列表信息(1、2、5为本机虚拟机网卡)
当前连接状态为无线连接,因此选择4,窗口提示:
”listeningonNetworkadapter‘Microsoft’onlocalhost…”开始监听,提示”Sendsuccessed”提示手写数据包发送成功,紧接着可以看到抓取到的数据包中包含之前发送的手写数据包,抓取IP包成功。
图1-2实时抓包画面
程序在后台将抓包结果写入文本文档中便于仔细查看:
图1-3抓包解析结果
分析
实验结果展示了设计功能已实现,并且在解析文本中显示成功抓取到手动封装的IP数据包,使用WireShake与解析数据一一进行比对,结果相同,整体来说较好的完成了预期目标。
实验二
双击系统图标,系统运行,检测到本机上线,在列表中显示本机信息,聊天窗口中提示本机上线。
图2-1新用户上线
在列表中选择要联系的主机,在发送窗口点击鼠标,输入要发送的信息敲击“回车”或点击“发送”,即在聊天窗口提示聊天记录。
图2-2聊天
选择用户,点击发送文件(本系统必须首先选择用户,否则无法发送),在打开文件的弹窗中选择要发送的文件,点击确定,文件即开始传送。
图2-3发送文件和接收
接受用户收到连接请求后收到提示,选择接收文件后并选择保存目录后,文件开始传输,传输完毕在聊天窗口提示文件接受成功。
同时显示文件保存目录。
图2-4接收文件成功
需要对聊天记录保存时,点击保存,即可将聊天记录保存为txt文本文件。
图2-5保存聊天记录
本系统基本实现了预期的各项功能,在同样使用UDP连接的列表建立和聊天中,为了避免发生接收误判,将其分为两个不同的端口进行处理。
此外在使用TCP连接传输文件的实现中,发现无法将文件的信息如文件名、文件类型、文件大小等与文件本身一并发送,需要发送两次数据方可实现。
在多用户的发送测试中,聊天发送与单用户类似,但在文件发送即使用TCP传输时需要选择好建立连接的时机和相应线程的建立,否则将出现意想不到的后果。
五:
结论(讨论)
1、实验结论
通过网络软件编程的实践,巩固了计算机网络课上学习到的IP、UDP、TCP等重要网络协议的工作机制和实现过程,通过自己动手编程封装与发送这些数据包,加深了对网络协议的理解。
通过局域网内文件传输和数据传输的实现,进一步体会到UDP协议在面向无连接状态下传播快速的优点,以及TCP建立的可靠连接在保证文件传输稳定过程中的重要作用。
在实际的网络编程中应当灵活运用不同协议的特点进行连接和传输。
2、讨论
在题目二使用广播来建立用户列表时遇到了问题,按照设计预期,系统应该在刚启动时发送一次广播就可以了,但实际上会出现有些软件收不到这些广播,导致不能发现这个刚上线的用户,解决方法是启动好不断发送广播。
同样的问题出现在用户下线时,因为这里只发送一次广播,会导致其他用户的列表上的这个用户一段时间后才会被移除,有的收不到的话就不移除。
这与我们的预期存在一定的差距,未解决这一问题我们还需要进一步的学习。
在多线程编程中发现如果将监听和广播作为摸个线程不间断运行,将可能导致对现有网络资源的抢占,添加线程睡眠()后,此问题得到解决