实验三IP数据包的解析上课讲义文档格式.docx

上传人:b****2 文档编号:3405754 上传时间:2023-05-01 格式:DOCX 页数:15 大小:74.75KB
下载 相关 举报
实验三IP数据包的解析上课讲义文档格式.docx_第1页
第1页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第2页
第2页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第3页
第3页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第4页
第4页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第5页
第5页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第6页
第6页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第7页
第7页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第8页
第8页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第9页
第9页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第10页
第10页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第11页
第11页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第12页
第12页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第13页
第13页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第14页
第14页 / 共15页
实验三IP数据包的解析上课讲义文档格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验三IP数据包的解析上课讲义文档格式.docx

《实验三IP数据包的解析上课讲义文档格式.docx》由会员分享,可在线阅读,更多相关《实验三IP数据包的解析上课讲义文档格式.docx(15页珍藏版)》请在冰点文库上搜索。

实验三IP数据包的解析上课讲义文档格式.docx

绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。

如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。

3.3接收数据包:

在程序中可使用recv()函数接收经过的IP包。

该函数有四个参数,第一个参数接收操作所用的套接字描述符;

第二个参数接收缓冲区的地址;

第三个参数接收缓冲区的大小,也就是所要接收的字节数;

第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。

因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。

设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。

3.4定义IP头部的数据结构:

程序需要定义一个数据结构表示IP头部。

其代码如下:

typedefstruct_IP_HEADER//定义IP头

{

union

{

BYTEVersion;

//版本(前4位)

BYTEHdrLen;

//IHL(后4位),报头标长

};

BYTEServiceType;

//服务类型

WORDTotalLen;

//总长

WORDID;

//标识

WORDFlags;

//标志(前3位)

WORDFragOff;

//分段偏移(后13位)

BYTETimeToLive;

//生命期

BYTEProtocol;

//协议

WORDHdrChksum;

//头校验和

DWORDSrcAddr;

//源地址

DWORDDstAddr;

//目的地址

BYTEOptions;

//选项

}IP_HEADER;

3.5IP包的解析:

解析IP包的字段有两种策略。

针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。

要解析长度不是8位倍数的字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。

3.6捕获处理:

1.加载Winsock;

2.创建一个接收原始IP包的socket连接;

3.绑定到一个接口;

4.进行WSAIoctl设置,接收所有的IP数据包。

代码如下:

//设置SOCK_RAW为SIO_RCVALL,能接收所有IP包

#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)

DWORDdwBufferLen[10];

DWORDdwBufferInLen=1;

DWORDdwBytesReturned=0;

WSAIoctl(sock,IO_RCVALL,&

dwBufferInLen,sizeof(dwBufferInLen),&

dwBufferLen,sizeof(dwBufferLen),&

dwBytesReturned,NULL,NULL);

5.接着设定一个线程进行捕获:

(1)创建一个接收IP包的链表头;

(2)设置一个标识,为真,则不断进行IP包的捕获;

(3)建立一个新的结点,将捕获的数据包加入到该结点;

(4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;

再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;

(5)为下一个IP包链表创建一个链表头。

6.建立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。

3.7程序流程图:

N

Y

四、运行结果:

截获IP数据包程序运行结果如下:

五、实验总结:

注:

在实验中对实验结果进行截屏。

1、要求对实验过程中截屏的数据进行分析和说明,分析其原因?

2、对照IP数据包的首部,说明“标识”的作用及DF、MF、分段偏移值三者的关系?

六、源程序代码:

#include"

winsock2.h"

ws2tcpip.h"

iostream.h"

stdio.h"

#pragmacomment(lib,"

ws2_32.lib"

//逐位解析IP头中的信息

voidgetVersion(BYTEb,BYTE&

version)

version=b>

>

4;

//右移4位,获取版本字段

}

voidgetIHL(BYTEb,BYTE&

result)

result=(b&

0x0f)*4;

//获取头部长度字段

char*parseServiceType_getProcedence(BYTEb)

switch(b>

5)//获取服务类型字段中优先级子域

case7:

return"

NetworkControl"

;

break;

case6:

InternetworkControl"

case5:

CRITIC/ECP"

case4:

FlashOverride"

case3:

Flsah"

case2:

Immediate"

case1:

Priority"

case0:

Routine"

default:

Unknow"

}

char*parseServiceType_getTOS(BYTEb)

b=(b>

1)&

0x0f;

//获取服务类型字段中的TOS子域

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&

0x1fff;

char*getProtocol(BYTEProtocol)//获取协议字段共8位

switch(Protocol)//以下为协议号说明:

ICMP"

IGMP"

return"

IPinIP"

TCP"

EGP"

case17:

UDP"

case41:

IPv6"

case46:

RSVP"

case89:

OSPF"

UNKNOW"

voidipparse(FILE*file,char*buffer)

IP_HEADERip=*(IP_HEADER*)buffer;

//通过指针把缓冲区的内容强制转化为IP_HEADER数据结构

fseek(file,0,SEEK_END);

BYTEversion;

getVersion(ip.Version,version);

fprintf(file,"

版本号=%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);

标识=%d\r\n"

ip.ID);

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(hopes)\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"

);

main()

intnRetCode=0;

//initializeMFCandprintanderroronfailure

/*if(!

AfxWinInit(:

:

GetModuleHandle(NULL),NULL,:

GetCommandLine(),0))

//TODO:

changeerrorcodetosuityourneeds

cerr<

<

_T("

FatalError:

MFCinitializationfailed"

)<

endl;

nRetCode=1;

else*/

codeyourapplication'

sbehaviorhere.

FILE*file;

if((file=fopen("

history.txt"

"

wb+"

))==NULL)

printf("

failtoopenfile%s"

return-1;

WSADATAwsData;

WSAStartup(MAKEWORD(2,2),&

wsData);

//建立套接字

SOCKETsock;

sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);

BOOLflag=TRUE;

//设置IP头操作选项,用户可对IP头处理

setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&

flag,sizeof(flag));

charhostName[128];

gethostname(hostName,100);

//获取本地地址

hostent*pHostIP;

pHostIP=gethostbyname(hostName);

//填充SOCKADDR_IN结构

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);

bind(sock,(PSOCKADDR)&

addr_in,sizeof(addr_in));

//把socket绑定到本地网卡

DWORDdwValue=1;

//设置SOCK_RAW为SIO_RCVALL,能接收所有IP包

#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)

DWORDdwBufferLen[10];

DWORDdwBufferInLen=1;

DWORDdwBytesReturned=0;

WSAIoctl(sock,IO_RCVALL,&

//设置接受数据包缓冲区长度

#defineBUFFER_SIZE65535

charbuffer[BUFFER_SIZE];

//监听网卡

printf("

开始解析经过本机的IP数据包:

\n"

while(true)

intsize=recv(sock,buffer,BUFFER_SIZE,0);

if(size>

0)

{

ipparse(stdout,buffer);

ipparse(file,buffer);

}

fclose(file);

return0;

returnnRetCode;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2