#include#include#include#pragma comment(lib,"ws2_32.lib")
//定義ip頭部結構
typedef struct _ip_header
; byte servicetype; //服務型別
word totallen; //總長度
word id; //標識
union
; byte timetolive; //生命期
byte protocol; //協議
word hdrchksum; //頭校驗和
dword srcaddr; //源位址
dword dstaddr; //目的位址
byte options; //選項
} ip_header;
#define sio_rcvall _wsaiow(ioc_vendor,1)
#define buffer_size 65535
//解析ip包的版本資訊
void getversion(byte b,byte &version)
//解析ip包的頭部長度
void getihl(byte b,byte &length)
//解析ip包的服務型別
char* parseservicetype_getprocedence(byte b)
}//解析ip包的服務級別
char* parseservicetype_gettos(byte b)
}//解析ip包的標誌位
void getflags(word w,byte &df,byte &mf)
//解析ip包的分段偏移
void getfragoff(word w,word &fragoff)
//解析ip包的協議型別
char* getprotocol(byte protocol)
}void ipparse(file* file,char* buffer)
void main(int argc,char* argv)
//開啟輸出日誌檔案
file* file;
if((file=fopen(argv[1],"wb+"))==null)
//初始化socket環境
wsadata wsdata;
if(wsastartup(makeword(2,2),&wsdata)!=0)
//建立原始socket
socket sock;
if((sock=socket(af_inet,sock_raw,ipproto_ip))==invalid_socket)
//設定ip頭部操作選項,flag設定為true
bool flag=true;
if(setsockopt(sock,ipproto_ip,ip_hdrincl,(char*)&flag,sizeof(flag))==socket_error)
//獲取本地主機名
char hostname[128];
if(gethostname(hostname,100)==socket_error)
//獲取本地主機ip位址
hostent* phostip;
if((phostip=gethostbyname(hostname))==null)
//填充sockaddr_in結構
sockaddr_in addr_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)
//設定sock_raw為sio_rcvall,接收所有的ip包
dword dwvalue=1;
dword dwbufferlen[10];
dword dwbufferinlen=1;
dword dwbytesreturned=0;
if(wsaioctl(sock,sio_rcvall,&dwbufferinlen,sizeof(dwbufferinlen),&dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,null,null)==socket_error)
//監聽經過本機的ip包
char buffer[buffer_size];
printf("listening on local host...\n");
while(true) }
fclose(file);
return;
}
IP分組首部格式
ipv4首部包含14個字段 fields 13是必需的,最後乙個可選。1 版本 version 4 bits,ipv4分組的version值為0100 2 首部長度 internet header length,ihl 4 bits,單位是4 bytes。最小值為5,此時首部不包含可選項 optio...
解析ip分組 帶你讀懂計算機網路之IP協議
ip協議是tcp ip體系中最重要的兩個協議之一,也是網際網路標準最重要的協議之一。ip位址是乙個32位的識別符號,能夠唯一標識網際網路上的一台主機,ip位址分為若干個固定類,每一類位址都有兩個固定長度的字段組成,第乙個欄位是網路號,標記當前主機所接入的網路。第二個欄位是主機號,標記當前主機本身。主...
IP分組頭部結構
ipv4首部一般是20位元組長。在乙太網幀中,ipv4包首部緊跟著乙太網幀首部,同時乙太網幀首部中的協議型別值設定為080016。ipv4提供不同,大部分是很少用的選項,使得ipv4包首部最長可擴充套件到60位元組 總是4個位元組4個位元組的擴充套件 04 8121619 2431 版本首部長度 服...