常見的網絡數據包的數據結構

//================================================
//文件名:MNetWorkPKT.h
//常見的網絡數據包的數據結構
//================================================


//前言說明
//================================================
//1個字節 = 8 位
//unsigned char -- 1個字節
//unsigned short -- 2個字節
//unsigned long -- 4個字節
//
//專業術語:報、消息、包、幀
//
//data   :原始的用戶數據
//segment:報文分段(包含控制信息),位於傳輸層的數據組
//packet:分組或者包,由應用層傳來的數據,將其分組成包
//frame :幀,負責將包(分組)裝成數據鏈路層數據格式
//bit   :位流
//================================================

#ifndef _NETWORK_PACKET_H
#define _NETWORD_PACKET_H

#pragma once

//地址定義
//------------------------------------------------
//IP地址定義
typedef struct _ip_addr
{
unsigned char ucByte1;
unsigned char ucByte2;
unsigned char ucByte3;
unsigned char ucByte4;
}ip_addr,IP_ADDR,* PIP_ADDR;

//MAC地址定義
typedef struct _mac_addr
{
unsigned char ucByte1;
unsigned char ucByte2;
unsigned char ucByte3;
unsigned char ucByte4;
unsigned char ucByte5;
unsigned char ucByte6;
}mac_addr,MAC_ADDR,* PMAC_ADDR;
//------------------------------------------------


//數據格式定義
//------------------------------------------------
//IP分組的首部
typedef struct _ip_header
{
unsigned char ucVerHeadLen;   //版本4位 + 首部長度4位
unsigned char ucTos;     //區分服務
unsigned short usTlen;     //總長度
unsigned short usId;     //惟一標識
unsigned short usFlagOffset;   //標誌與偏移量
unsigned char ucTTL;     //TTL
unsigned char ucProtocol;    //協議
unsigned short usCheckSum;    //校驗和
IP_ADDR    ipaSaddr;    //源地址
IP_ADDR    ipaDaddr;    //目的地址
}ip_header,IP_HEADER,* PIP_HEADER;

//MAC幀首部格式
typedef struct _eth_header
{
MAC_ADDR   maDes;     //目地MAC地址
MAC_ADDR   maSrc;     //源MAC地址
unsigned short usEthType;    //數據部分類型協議:ARP、IP、RARP
}eth_header,ETH_HEADER,* PETH_HEADER;

//ARP數據包格式
typedef struct _arp_packet
{
unsigned short usHardWareAddrType;   //硬件地址類型
unsigned short usProtocolAddrType;   //協議地址類型
unsigned char ucHardWareAddrLength; //硬件地址長度
unsigned char ucProtocolAddrLength; //協議地址長度
unsigned short usOptionCode;    //選項碼(請求、應答)
MAC_ADDR   maSenderHDAddr;    //發送者的硬件地址
IP_ADDR    maSenderIPAddr;    //發送者的IP地址
MAC_ADDR   maTargetHDAddr;    //目標的硬件地址
IP_ADDR    maTargetIPAddr;    //目標的協議地址
unsigned char ucPaddingCode[18];   //填充碼(大於18個字節)
}arp_packet,ARP_PACKET,* PARP_PACKET;

//ARP數據幀格式
typedef struct _arp_frame
{
ETH_HEADER   ethHeader;     //以太網幀頭
ARP_PACKET   arpPacket;     //ARP數據包
}arp_frame,ARP_FRAME,*PARP_FRAME;

//ICMP數據報的首部
typedef struct _icmp_header
{
unsigned char ucType;     //類型
unsigned char ucCode;     //代碼
unsigned short usChkSum;    //檢驗和
}icmp_header,ICMP_HEADER,* PICMP_HEADER;

//ICMP數據報的三種常見格式

//ICMP報文一:請求與回覆報文
typedef struct _icmp_echo_message
{
ICMP_HEADER    icmpHeader;   //ICMP報頭
unsigned short   usIdentifier; //ICMP標識符
unsigned short   usSeqNumber; //ICMP序號

//TimeSend並不RFC文檔的標準,在標準中只有data域
unsigned long   ulTimeSend;   //發送請求時間,用於計算往返時間
}icmp_echo_message,ICMP_ECHO_MESSAGE,*PICMP_ECHO_MESSAGE;

//ICMP報文二:超時差錯報文
typedef struct _icmp_exceeded_message
{
ICMP_HEADER    icmpHeader;   //ICMP報頭
unsigned char   ucUnused[4]; //不使用,但必須清零
IP_HEADER    iphReIPHeader; //產生差錯的IP首部
unsigned char   strOriData[8]; //原始的8字節的數據
}icmp_exceeded_message,ICMP_EXCEEDED_MESSAGE,*PICMP_EXCEEDED_MESSAGE;

//ICMP報文三:時間戳與時間戳回覆報文
//時間戳:距離某一時刻逝去的時間間隔
typedef struct _icmp_timestamp_message
{
ICMP_HEADER    icmpHeader;    //ICMP報頭
unsigned short   usIdentifier;   //ICMP標識符
unsigned short   usSeqNumber;   //ICMP序號
unsigned long   ulOriTimeStamp;   //原始時間戳
unsigned long   ulRecTimeStamp;   //接收者時間戳
unsigned long   ulTransmitTimeStamp;//傳送時間戳
}icmp_timestamp_message,ICMP_TIMESTAMP_MESSAGE,*PICMP_TIMESTAMP_MESSAGE;

//UDP數據包頭的格式
typedef struct _upd_header
{
unsigned short   usSrcPort;    //源端口
unsigned short   usDesPort;    //目的端口
unsigned short   usDGramLength;   //數據報長度
unsigned short   usChkSum;    //檢驗和
}upd_header,UPD_HEADER,*PUDP_HEADER;

//僞首部(UDP / TCP都適用)
typedef struct _pseudo_header
{
IP_ADDR     ipaSrcAddr;    //源地址
IP_ADDR     ipaDesAddr;    //目的地址
unsigned char   ucZero;     //0域
unsigned char   ucProtocol;    //協議
unsigned short   usPktLength;   //數據報長度
}pseudo_header,PSEUDE_HEADER,*PPSEUDE_HEADER;

//------------------------------------------------


//簡單的輸出格式(控制檯)
#ifdef _CONSOLE
#include
//------------------------------------------------
void PrintIPAddr(const IP_ADDR * p)
{//格式輸出IP地址:如,192.168.1.101
if (p!= 0)
{
printf("%u.%u.%u.%u", p->ucByte1,
p->ucByte2,
p->ucByte3,
p->ucByte4);
}
}
//------------------------------------------------
void PrintMACAddr(const MAC_ADDR * p)
{//16進制格式輸出MAC地址:如,00-0C-29-D2-6B-A5
if (p != 0)
{
printf("%02X-%02X-%02X-%02X-%02X-%02X",
p->ucByte1,
p->ucByte2,
p->ucByte3,
p->ucByte4,
p->ucByte5,
p->ucByte6);
}
}
//------------------------------------------------
#endif

#endif

 

//編程規約,保留勿刪
//=================================================
//
//變 量   名:類型 + 名字(首字大寫)
//          如,整型數據,int nRecv, char * pSend;
//
//函 數   名:名字(首字大寫)
//      如,函數void DeleteData();
//
//數據類型名:全小寫或者全大寫,全小寫取下劃線分隔,
//     如果是涉及自定義指針一律用P+全大寫,
//     如ip_header,IP_HEADER,PIP_HEADER;
//
//注 釋 風格:一律用"//"和中文,少數情況可以用英文;
//     大模塊之間用"="分隔,小模塊用"-"分隔。
//

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章