//================================================
//文件名: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;
//
//注 釋 風格:一律用"//"和中文,少數情況可以用英文;
// 大模塊之間用"="分隔,小模塊用"-"分隔。
//