计算机网络课程设计报告Word文档下载推荐.docx
- 文档编号:22146889
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:27
- 大小:39.76KB
计算机网络课程设计报告Word文档下载推荐.docx
《计算机网络课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
(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"
pcap.h"
remote-ext.h"
stdio.h"
stdlib.h"
/*4字节的IP地址*/
typedefstructip_address{
u_charbyte1;
u_charbyte2;
u_charbyte3;
u_charbyte4;
}ip_address;
/*IPv4首部*/
typedefstructip_header{
u_charver_ihl;
//版本(4bits)+首部长度(4bits)
u_chartos;
//服务类型
u_shorttlen;
//总长类型
u_shortidentification;
//标识
u_shortflags_fo;
//标志位+段偏移量
u_charttl;
//存活时间
u_charproto;
//协议
u_shortcrc;
//首部校验和
ip_addressdaddr;
//目的地址
ip_addresssaddr;
//源地址
u_intop_pad;
//选项与填充
}ip_header;
voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);
/*packethandler函数原型*/
intmain()
{
pcap_if_t*alldevs;
pcap_if_t*d;
intinum;
inti=0;
pcap_t*adhandle;
charerrbuf[PCAP_ERRBUF_SIZE];
u_intnetmask;
charpacket_filter[]="
ip"
;
//抓包类型
structbpf_programfcode;
pcap_dumper_t*dumpfile;
/*获取本机设备列表*/
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&
alldevs,errbuf)==-1)
{
fprintf(stderr,"
Errorinpcap_findalldevs:
%s\n"
errbuf);
exit
(1);
}
/*打印适配器列表*/
for(d=alldevs;
d;
d=d->
next)
printf("
%d.%s"
++i,d->
name);
if(d->
description)
printf("
(%s)\n"
d->
description);
else
(Nodescriptionavailable)\n"
);
if(i==0)
\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,//设备名
65536,//65535保证能捕获到不同数据链路层上每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS,//混杂模式
1000,//读取超时时间
NULL,//远程机器验证
errbuf//错误缓冲池
))==NULL)
\nUnabletoopentheadapter.%sisnotsupportedbyWinPcap\n"
/*打开堆文件*/
dumpfile=pcap_dump_open(adhandle,"
D:
\\save.txt"
if(dumpfile==NULL)
\nErroropeningoutputfile\n"
/*检查数据链路层,只考虑以太网*/
if(pcap_datalink(adhandle)!
=DLT_EN10MB)
fprintf(stderr,"
nThisprogramworksonlyonEthernetnetwords.n"
if(d->
addresses!
=NULL)
//获得接口第一个地址的掩码
netmask=((structsockaddr_in*)(d->
addresses->
netmask))->
sin_addr.S_un.S_addr;
else
//如果接口没有地址,那么我们假设一个C类的掩码
netmask=0xffffff;
//编译过滤器
if(pcap_compile(adhandle,&
fcode,packet_filter,1,netmask)<
0)
nUnabletocompilethepacketfilter.Checkthesyntax.n"
//释放设备列表
//设置过滤器
if(pcap_setfilter(adhandle,&
fcode)<
nErrorsettingthefilter.n"
\nlisteningon%s...\n"
//释放设备列表
pcap_freealldevs(alldevs);
/*手写数据包*/
u_charpacket[100];
/*假设在以太网上,设置MAC的目的地址为1:
1:
1*/
packet[0]=1;
packet[1]=1;
packet[2]=1;
packet[3]=1;
packet[4]=1;
packet[5]=1;
/*设置MAC的源地址为2:
2:
2*/
packet[6]=2;
packet[7]=2;
packet[8]=2;
packet[9]=2;
packet[10]=2;
packet[11]=2;
/*设置ip类型*/
packet[12]=0x08;
packet[13]=0x00;
packet[14]=0x45;
packet[15]=0x20;
packet[16]=0x00;
packet[17]=0x28;
packet[18]=0xcb;
packet[19]=0x16;
packet[20]=0x00;
packet[21]=0x00;
packet[22]=0x2e;
packet[23]=0x06;
packet[24]=0x3e;
packet[25]=0xe6;
packet[26]=0xc0;
//192
packet[27]=0xa8;
//168
packet[28]=0x01;
//1
packet[29]=0x64;
//100
packet[30]=0xc0;
packet[31]=0xa8;
packet[32]=0x01;
packet[33]=0x64;
packet[34]=0x8f;
packet[35]=0x50;
/*填充剩下的内容*/
for(i=36;
i<
100;
i++)
packet[i]=i%256;
/*发送数据包*/
if(pcap_sendpacket(adhandle,packet,100/*size*/)!
=0)
nErrorsendingthepacket:
n"
pcap_geterr(adhandle));
return0;
}else{
Sendsuccessed"
/*开始捕获*/
pcap_loop(adhandle,0,packet_handler,(unsignedchar*)dumpfile);
//回调方式捕获数据包
pcap_close(adhandle);
return0;
}
/*每次捕获到数据包时,libpcap都会自动调用这个回调函数*/
voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data)
structtm*ltime;
chartimestr[16];
ip_header*ih;
u_intip_len;
time_tlocal_tv_sec;
//保存数据包到文件中
pcap_dump((u_char*)param,header,pkt_data);
/*将时间戳转换成可识别的格式*/
local_tv_sec=header->
ts.tv_sec;
ltime=localtime(&
local_tv_sec);
strftime(timestr,sizeoftimestr,"
%H:
%M:
%S"
ltime);
//打印数据包的时间戳和长度
%s,%.6dlen:
%d\n"
timestr,header->
ts.tv_usec,header->
len);
//获得IP数据包头部的位置
ih=(ip_header*)(pkt_data+14);
//以太网头部长度
/*打印IP地址和UDP端口*/
版本+首部长度:
[%u]"
ih->
ver_ihl);
协议:
proto);
首部校验和:
crc);
目的地址:
[%u.%u.%u.%u]"
ih->
daddr.byte1,ih->
daddr.byte2,ih->
daddr.byte3,ih->
daddr.byte4);
源地址:
[%u.%u.%u.%u]\n"
saddr.byte1,ih->
saddr.byte2,ih->
saddr.byte3,ih->
saddr.byte4);
FILE*fp;
fp=fopen("
\\jiexi.txt"
"
a+"
fprintf(fp,"
解析结果:
fclose(fp);
2、实验2:
子网内文件传送
(明确的实验内容)
设计并实现一个局域网内部的文件传送工具,使用TCP协议进行可靠文件传输。
以图形界面运行,不同结点上文件自动同步
(详细的实验步骤(系统/方法/算法等),图文结合)
1)问题定义:
实现一个局域网内的文件传送与聊天的软件
2)需求分析:
局域网内的文件传送应当具备以下功能:
在线用户的及时发现和更新
选择一对一或者一对多对话模式
与选择用户进行聊天和文件传输
用户下线通知与更新用户列表
3)系统设计:
参考飞鸽传书的实现原理,总结设计方案如下:
架构设计:
本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;
互相发现:
本系统运行时启动局域网广播线程,发出包含主机名称、主机IP以及新加入标识符的广播表明自己新加入;
用户列表:
监听到其他用户的广播信息后更新列表,显示当前在线的用户名和用户IP;
更新列表:
在系统退出时会广播本机信息,标识表明自己离开,其余在线用户接收到信息后更新提示该用户下线;
选择用户:
可以单独选择或者多项选择用户列表中的用户;
发送消息:
选择用户后,在输入框中输入聊天信息,点击“发送”按钮系统会发送UDP数据包给对应用户的ip地址,端口是8011;
接受消息:
系统实时监听8011端口以接受不同用户发来的消息并展示在聊天窗口中;
发送文件:
选择指定用户,点击“发送文件”按钮,选择本机相应文件后,与目标用户建立TCP连接,发送字节流。
端口为8011;
接受文件:
监听到有TCP连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进行接收,接收成功后再聊天窗口显示提示信息。
4)详细设计:
1 局域网用户列表的建立:
软件启动后定时的使用UDP协议向255.255.255.255这个广播地址发送广播包,端口设置为8001。
广播包内容包含主机名、IP、标识符等信息,已启动软件的用户通过8001端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、IP地址等信息,从而局域网内的本系统用户都能建立起用户列表;
2 传送与接收信息:
传送聊天信息时同样使用UDP协议,用户填写消息后点击按钮调用发送消息的函数,然后通过8011端口发送UDP包。
系统在启动时通过开辟新线程来监听8011端口,时刻监听发送到本机的信息。
3 发送文件:
用户发送文件时建立一个带参数的线程来发送文件,调用相应的TCP发送函数来发送文件,使用的是8001端口,由于协议不同因此与之前的广播并不冲突;
4 接收文件:
软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立TCP连接的请求,之后提示用户收到文件选择是否接受,之后选择保存路径,进行接收。
5 用户离开:
用户离线时发送一个离线广播包到255.255.255.255的8001端口,包中含有LEAVE的标识符,收到此广播包的用户,根据包中的IP地址删除用户列表中相应的用户信息,并在聊天窗口显示“XXX用户已经离开”;
6 聊天记录保存:
考虑到用户有保存聊天记录的需求,在聊天记录右侧点击“保存”按钮,可以将当前聊天记录保存为txt文件到用户指定目录中。
或点击“清空”,清空当前用户聊天记录。
5)具体实现:
(C#)
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.IO;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
namespaceIPMessage
publicpartialclassfrmMain:
Form
//用户实体
publicclassUser
privatestringlocalname;
//用户名
publicstringlocalName
get{returnlocalname;
set{localname=value;
privatestringlocalip;
//用户IP
publicstringlocalIP
get{returnlocalip;
set{localip=value;
//用户数组声明
publicstaticList<
User>
Userslist=newList<
();
//获得本机名和本机IP
publicUsergetInfo()
Useru=newUser();
stringlocalName=Dns.GetHostName();
//获取主机名
//Console.WriteLine("
主机名:
{0}"
localName);
u.localName=localName;
IPHostEntrylocalHost=Dns.GetHostEntry(localName);
//输出对应的IP地址
IPAddresslocalIP=null;
for(inti=0;
i<
localHost.AddressList.Length;
i++)
if(localHost.AddressList[i].AddressFamily==AddressFamily.InterNetwork)
localIP=localHost.AddressList[i];
break;
u.localIP=localIP.ToString();
returnu;
//发送广播消息
publicvoidbroadMessage()
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPointiep=newIPEndPoint(IPAddress.Parse("
255.255.255.255"
),8001);
//设置Broadcast值为表示允许套接字发送广播消息,该值默认为不允许
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);
Useru=getInfo();
//标识符为NEW
stringsend="
NEW"
+"
"
+u.loca
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 报告