解析IP分組

2021-08-10 04:30:30 字數 2458 閱讀 3398

#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 版本首部長度 服...