解析IP数据包Word文件下载.docx
- 文档编号:19763247
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:13
- 大小:201.69KB
解析IP数据包Word文件下载.docx
《解析IP数据包Word文件下载.docx》由会员分享,可在线阅读,更多相关《解析IP数据包Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
2、为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)编程。
但是,要注意的是:
通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。
对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。
我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。
3、流程图如下:
三、详细设计
#include"
winsock2.h"
ws2tcpip.h"
iostream.h"
stdio.h"
#pragmacomment(lib,"
ws2_32.lib"
)
#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)
#defineBUFFER_SIZE65535
/*定义IP头部数据结构*/
typedefstruct_IP_HEADER{
union{
BYTEVersion;
//版本(前4位)
BYTEHdrLen;
//报头标长(后四位),IP头长度
};
BYTEServiceType;
//服务类型
WORDTotalLen;
//总长度
WORDID;
//标识
WORDFlags;
WORDFragOff;
BYTETimeToLive;
BYTEProtocol;
WORDHdrChksum;
DWORDSrcAddr;
DWORDDstAddr;
BYTEOptions;
}IP_HEADER;
//逐位解析IP头中的信息,获取版本号
voidgetVersion(BYTEb,BYTE&
version)
{
version=b>
>
4;
}
voidgetIHL(BYTEb,BYTE&
result)
result=(b&
0x0f)*4;
//解析服务类型
char*parseServiceType_getProcedence(BYTEb){
switch(b>
5){
case7:
return"
NetworkControl"
;
case6:
InternetworkControl"
case5:
CRITIC/ECP"
case4:
FlashOverride"
case3:
Falsh"
case2:
Immediate"
case1:
Priority"
case0:
Routine"
default:
Unknown"
}
char*parseServiceType_getTOS(BYTEb){
b=(b>
1)&
0x0f;
switch(b){
Normalservice"
Minimizemonetarycost"
Maximizereliability"
Maximizethroughput"
case8:
Minimizedelay"
case15:
Maximizesecurity"
/*获取禁止分片标志和分片标志*/
voidgetFlags(WORDw,BYTE&
DF,BYTE&
MF){
DF=(w>
14)&
0x01;
MF=(w>
13)&
/*获取分片偏移量*/
voidgetFragoff(WORDw,WORD&
fragoff){
fragoff=w&
0x1ffff;
//获取协议
char*getProtocol(BYTEProtocol){
switch(Protocol){
ICMP"
IGMP"
GGP"
IPinIP"
TCP"
EGP"
case17:
UDP"
case41:
IPv6"
case46:
OSPF"
UNKNOWN"
/*解析IP数据包*/
voidipparse(FILE*file,char*buffer){
IP_HEADERip=*(IP_HEADER*)buffer;
fseek(file,0,SEEK_END);
BYTEversion;
getVersion(ip.Version,version);
fprintf(file,"
版本=IPV%d\r\n"
version);
BYTEheaderLen;
getIHL(ip.HdrLen,headerLen);
头长度=%d(BYTE)\r\n"
headerLen);
服务类型=%s,%s\r\n"
parseServiceType_getProcedence(ip.ServiceType),
parseServiceType_getTOS(ip.ServiceType));
数据报长度=%d(BYTE)\r\n"
ip.TotalLen);
数据报ID=%d\r\n"
ip.ID);
/*DF表示禁止分片标志,MF表示分片标记*/
BYTEDF,MF;
getFlags(ip.Flags,DF,MF);
分段标志DF=%d,MF=%d\r\n"
DF,MF);
WORDfragOff;
getFragoff(ip.FragOff,fragOff);
分段偏移值=%d\r\n"
fragOff);
生存期=%d(hops)\r\n"
ip.TimeToLive);
协议=%s\r\n"
getProtocol(ip.Protocol));
头校验和=0x%0x\r\n"
ip.HdrChksum);
源IP地址=%s\r\n"
inet_ntoa(*(in_addr*)&
ip.SrcAddr));
目的IP地址=%s\r\n"
ip.DstAddr));
__________________________________\r\n"
);
/*程序入口*/
intmain(intargc,char*argv[]){
/*cmd参数*/
if(argc!
=2){
printf("
usageerror!
\n"
return-1;
FILE*file;
/*以读写的方式建立一个文本文件logfile.txt*/
if((file=fopen(argv[1],"
w+"
))==NULL){
failtoopenfile%s"
"
logfile.txt"
WSADatawsData;
/*启动2.2版本的Socket,并将Socket版本信息保存到wsData中*/
if(WSAStartup(MAKEWORD(2,2),&
wsData)!
=0){
WSAstartupfailed!
Socket初始化...\r\n"
==================================\r\n"
描述:
%s\r\n"
wsData.szDescription);
状态:
wsData.szSystemStatus);
SOCKETsock;
/*创建原始套接字*/
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){
Cannotcreatesocket!
BOOLflag=true;
/*设置IP头操作选项*/
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&
flag,sizeof(flag))==SOCKET_ERROR){
setsockoptfailed!
charhostName[128];
/*获取本地主机名*/
if(gethostname(hostName,100)==SOCKET_ERROR){
gethostnamefailed!
hostent*pHostIP;
/*根据主机名获取主机信息*/
if((pHostIP=gethostbyname(hostName))==NULL){
gethostbynamefailed!
Hostname:
%s\r\n"
pHostIP->
h_name);
IPAddress:
inet_ntoa(*((structin_addr*)pHostIP->
h_addr)));
/*封装IP地址信息*/
sockaddr_inaddr_in;
addr_in.sin_addr=*(in_addr*)pHostIP->
h_addr_list[0];
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(6000);
//监听的端口号
/*把Socket绑定到本地网卡*/
if(bind(sock,(PSOCKADDR)&
addr_in,sizeof(addr_in))==SOCKET_ERROR){
bindfailed"
DWORDdwBufferLen[10];
DWORDdwBufferInLen=1;
DWORDdwBytesReturned=0;
/*设置网卡为混杂模式*/
if(WSAIoctl(sock,IO_RCVALL,&
dwBufferInLen,sizeof(dwBufferInLen),
&
dwBufferLen,sizeof(dwBufferLen),&
dwBytesReturned,NULL,NULL)==SOCKET_ERROR){
icotlsocketfailed\n"
charbuffer[BUFFER_SIZE];
=============开始解析=============\r\n"
while(true){
/*从套接字接收IP数据报*/
intsize=recv(sock,buffer,BUFFER_SIZE,0);
if(size>
0){
ipparse(stdout,buffer);
ipparse(file,buffer);
/*解除Socket绑定*/
if(WSACleanup()==SOCKET_ERROR){
WSACleanupfailed!
/*关闭文件*/
fclose(file);
return0;
}
四、测试数据及其结果分析
1、在“运行”中输入cmd命令:
2、截获IP数据包程序运行结果如下:
五、课程设计总结
1、课程设计过程中的问题与分析
(1)在学校的机房里还会捕获到目的IP地址第四位为255的数据包,这是属于子网广播号。
(2)不是所有的数据包都能捕获,如:
IP数据包以外的数据包都抓不到,只支持ICMP、TCP、UDP、IGMP等协议。
2、课程设计过程的收获和感受
这次课程设计是解析IP数据包,通过本次课程设计,我充分运用了所学的计算机网络知识并查阅了大量的案例,学到了很多知识,对计算机网络有了更深入的了解,同时,更深刻的了解到了IP数据包的结构及IP协议的相关问题,对IP层的工作原理也有了更好的学习,受益匪浅。
在此期间,蒋老师也给予我很大的帮助,给我排解了许多困惑,教会我许多知识,让我的实践能力得到了很大的提升。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 解析 IP 数据包