设计一个解析IP数据包的程序网络协议课程设计报告Word文档下载推荐.docx
《设计一个解析IP数据包的程序网络协议课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《设计一个解析IP数据包的程序网络协议课程设计报告Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
3.2.1利用原始套接字
套接字分为三种,即流套接字(Streamsocket)、数据报套接字(DatagramSocket)
和原始套接字(RawSocket)。
要进行IP层数据包的接收和发送,应利用原始套接字。
创建原始套接字的代码如下:
Socketsock:
Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped):
本设计不用考虑超时情况。
创建套接后,IP头就会包括在接收数据包中。
然后,我可以设置IP操作选项,挪用setsockopt函数。
其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处置。
最后利用bind()函数将socket绑定到本地网卡上。
绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。
若是接收的数据包中的协议类型和概念的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以够接收所有通过的IP包。
3.2.2接收数据包
在程序中可利用recv()函数接收通过的IP包。
该函数有四个参数,第一个参数接收操作所用的套接字描述符;
第二个参数接收缓冲区的地址;
第三个参数接收缓冲区的大小,也就是所要接收的字节数;
第四个参数是一个附加标志,若是对所发送的数据没特殊要求,直接设为0。
因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。
设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。
3.2.3概念IP头部的数据结构
程序需要概念一个数据结构表示IP头部。
其代码如下:
3.2.4析IP数据包设计相关知识
互联网层是TCP/IP协议参考模型中的关键部份。
IP协议把传输层送来的消息组装成IP数据包,并把IP数据传递给数据链路层。
IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除各通信子网间的不同,从而为信息发送方和接收方提供了透明的传输通道。
编制本程序前,首先要对IP包的格式有必然的了解。
IP数据包的第一字段是版本字段,其长度为4位,表示所利用的IP协议的版本。
目前的版本IPV4,版本字段的值为4,下一代的版本是IPV6,版本字段的值为6。
本程序主要针对版本值为4的IP数据包的解析。
报头标长(IHL)字段为4位,它概念了以4B为一个单位的IP包的报头长度。
报头除选项字段和填充域字段外,其他各字段是定长的。
因此,IP数据包的头长度在20-40B之间,是可变的。
04816192431
版本
报头标长
服务类型
总长度
标识
标志
片偏移
生存时间
协议
头校验和
源IP地址
目的IP地址
选项
填充域
数据部分
IP数据包的格式
5.程序流程图:
6.程序设计
协议的概念
(包括相应的头文件#include#include):
DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/
dwProtocol=IPPROTO_IP;
/*协议类型为IP*/
捕捉处置
1.加载Winsock;
2.创建一个接收原始IP包的socket连接;
3.用setsockopt()函数设置socket可以对IP头进行处置
4.绑定到一个接口;
5.进行WSAIoctl设置,接收所有的IP数据包。
代码如下:
if(SOCKET_ERROR==WSAIoctl(sock,SIO_RCVALL,&
dwBufferInLen,sizeof(dwBufferInLen),
&
dwBufferLen,sizeof(dwBufferLen),&
dwBytesReturned,NULL,NULL))
6.接着捕捉包:
(1)创建一个接收IP包头;
(2)设置一个标识,为真,则不断进行IP包的捕捉;
(3)成立一个新的结点,将捕捉的数据包加入到该结点;
(4)若是链表的长度达到指定的长度,创建一个线程对该IP包进行解析;
7.成立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。
运行界面
调试之前,原始dos界面:
调试以后,图形界面:
7.实验结果
日记文件:
默许输出文件为,可自选输出文件。
执行文件为
8.自我评析和总结
实训心得
这次计算机网络实训“解析IP数据包”,通过近一周的上机操作,我充分应用了所学的计算机网络和C语言的知识,并去图书馆查阅了一些书集和上网搜索一部份相关资料。
本次课程设计我查阅了大量的案例,学到了很多知识,对计算机网络有了更深切的了解,收获很大。
之前的学习仅限于书本,很多东西都只知其但是不知其所以然。
通过具体分析,设计出了这个系统,充分运用了所学的计算机网络知识解析IP数据包,从而加倍深刻的了解到了IP数据包的结构及IP协议的相关问题,对IP层的工作原理有更好的理解和熟悉。
课程设计是培育咱们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对咱们实际工作能力的具体训练和考察进程。
随着科学技术发展的日新月异,网络已经成为现今计算机发展中空前活跃的领域,在生活中可以说是无处不在,因此作为二十一世纪的计算机专业的大学生来讲掌握网络技术是十分重要的。
实训日记
礼拜一:
选择题目咱们两人在一块进行讨论,对课程题目要求有进一步的了解,分析程序的流程。
礼拜二:
通过一天的构思,大致有了点想法,开始认真编写程序。
礼拜三:
虽然有构思,但构思还只停留在大脑中,具体实现仍是有必然的难度,首先IP抓包进程不知道怎么实现。
我很费解!
礼拜四:
通过大量的阅读相关图书和上网查询,了解了部份功能的实现进程。
通过一天的尽力,系统初见眉目。
但还不怎么完美,没达到我的要求。
礼拜五:
略微调试部份代码,功能大体实现。
向老师和同窗演示
9.主要参考资料
[1]《计算机网络》(第5版)谢希仁编著电子工业出版社
[2]《网络协议分析》寇晓蕤罗俊勇编著机械工业出版社
[3]《C语言程序设计》张建伟李秀琴主编科学出版社
[4]《C++程序设计教程——面向对象分册》郑秋生主编
电子工业出版社
10.附录
#include<
>
#pragmacomment(lib,"
ws2_32"
)
#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)
#defineMAX_NUM500n"
);
fclose(fp);
//开始捕捉包
inti=1;
while(true){
charrecvbuf[65535],*bufwork;
//用来接收的缓冲区
intrecvsize;
//取得包的大小
memset(recvbuf,0,sizeof(recvbuf));
recvsize=recv(sock,recvbuf,sizeof(recvbuf),0);
//捕捉包
if(recvsize<
0)
{
continue;
}
IPHEADER*ipheader;
bufwork=recvbuf;
ipheader=(IPHEADER*)bufwork;
//处置头部
//取得包中的源IP和目的IP
charszSource[16],szDest[16];
in_addrina;
=ipheader->
sourceIP;
strcpy(szSource,inet_ntoa(ina));
destIP;
strcpy(szDest,inet_ntoa(ina));
char*strproto=get_proto_name(ipheader->
proto);
char*strtos=get_tos(ipheader->
tos);
//向文件和屏幕输出包的信息
fp=fopen(file[1],"
a"
fprintf(fp,"
%3dIPv%1d%6d字节%10s%8d字节%10d%2d%6d%10d%5s%8d%20s%20s\n"
i,ipheader->
version,ipheader->
header_len*4,
strtos,ipheader->
total_len,ipheader->
ident,(ipheader->
flags)>
13,((ipheader->
flags)<
<
3)>
3,
ipheader->
ttl,strproto,ipheader->
checksum,szSource,szDest);
printf("
i++;
if(i>
MAX_NUM)break;
WSACleanup();
closesocket(sock);
returnfalse;
}
此程序用VC可在Dos下运行,但界面为Dos界面,故添加C++控件后出现图形界面,结果同上图运行界面,添加控件单独为一sniffer文件夹。
文档来源网络,版权归原作者。
如有侵权,请告知,我看到会立刻处置。