计算机网络课程设计
——机械工业出版社
第7章:解析IP数据包
课程设计目的:
本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
完整程序代码:
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
typedef struct _IP_HEADER
{
union
{
BYTE Version;
BYTE HdrLen;
};
BYTE ServiceType;
WORD TotalLen;
WORD ID;
union
{
WORD Flags;
WORD FragOff;
};
BYTE TimeToLive;
BYTE Protocol;
WORD HdrChksum;
DWORD SrcAddr;
DWORD DstAddr;
BYTE Options;
} IP_HEADER;
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535
void getVersion(BYTE b,BYTE &version)
{
version=b>>4;
}
void getIHL(BYTE b,BYTE &length)
{
length=(b&0x0f)*4;
}
char* parseServiceType_getProcedence(BYTE b)
{
switch(b>>5)
{
case 7:
return "Network Control";
break;
case 6:
return "internet work Control";
break;
case 5:
return "CRITIC/ECP";
break;
case 4:
return "Flash Override";
break;
case 3:
return "Flash";
break;
case 2:
return "Immediate";
break;
case 1:
return "Priority";
break;
case 0:
return "Routine";
break;
default:
return "Unknown";
}
}
char* parseServiceType_getTOS(BYTEb)
{
b=(b>>1)&0x0f;
switch(b)
{
case 0:
return "Normal Service";
break;
case 1:
return "Minimize monetary cost";
break;
case 2:
return "Maximize reliability";
break;
case 4:
return "Maximize throughput";
break;
case 8:
return "Minimize delay";
break;
case 15:
return "Maximize security";
break;
default:
return "Unknown";
}
}
void getFlags(WORD w,BYTE &DF,BYTE &MF)
{
DF=(w>>14)&0x01;
MF=(w>>13)&0x01;
}
void getFragOff(WORD w,WORD &fragOff)
{
fragOff=w&0x1fff;
}
char* getProtocol(BYTE Protocol)
{
switch (Protocol)
{
case 1:
return "ICMP";
case 2:
return "IGMP";
case 4:
return "IP in IP";
case 6:
return "TCP";
case 8:
return "EGP";
case 17:
return "UDP";
case 41:
return "IPv6";
case 46:
return "RSVP";
case 89:
return "OSPF";
default:
return "UNKNOWN";
}