📄 07源程序.txt
字号:
#include "stdafx.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#include "iostream.h"
#include "stdio.h"
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;
void getVersion(BYTE b, BYTE & version)
{
version=b>>4;
}
void getIHL(BYTE b, BYTE & result)
{
result=(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(BYTE b)
{
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";
}
}
void ipparse(FILE * file, char * buffer)
{
IP_HEADER ip= *(IP_HEADER *)buffer;
fseek(file, 0, SEEK_END);
BYTE version;
getVersion(ip.Version, version);
fprintf(file, "版本= %d\r\n", version);
BYTE headerLen;
getIHL(ip.HdrLen, headerLen);
fprintf(file, "头长度 = %d(BYTE\r\n", headerLen);
fprintf(file, "服务类型 = %s, %s\r\n",
parseServiceType_getProcedence(ip.ServiceType),
parseServiceType_getTOS(ip.ServiceType));
fprintf(file, "数据报长度 = %d(BYTE)\r\n", ip.TotalLen);
fprintf(file, "数据报ID = %d\r\n", ip.ID);
BYTE DF, MF;
getFlags(ip.Flags, DF, MF);
fprintf(file, "分段标志 DF = %d,MF= %d\r\n", DF, MF);
WORD fragOff;
getFragOff(ip.FragOff, fragOff);
fprintf(file, "分段偏移值 = %d\r\n", fragOff);
fprintf(file, "生存期 = %d(hops)\r\n", ip.TimeToLive);
fprintf(file, "协议 = %s\r\n", getProtocol(ip.Protocol));
fprintf(file, "头校验和 = 0x%0x\r\n", ip.HdrChksum);
fprintf(file, "源IP地址 = %s\r\n", inet_ntoa(*(in_addr*)&ip.SrcAddr));
fprintf(file, "目的IP地址 = %s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));
fprintf(file, "---------------------------------------------\r\n");
}
int main(int argc,char* argv[])
{
if(argc !=2)
{
printf("usage error!\n");
return -1;
}
FILE * file;
if((file=fopen(argv[1],"wb+"))==NULL)
{
printf("fail to open file %s",argv[1]);
return -1;
}
WSADATA wsData;
if(WSAStartup(MAKEWORD(2,2),&wsData)!=0)
{
printf("WSAStartup failed!\n");
return -1;
}
SOCKET sock;
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
{
printf("create socket failed!\n");
return -1;
}
BOOL flag=TRUE;
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt failed!\n");
return -1;
}
char hostName[128];
if(gethostname(hostName,100)==SOCKET_ERROR)
{
printf("gethostname failed!\n");
return -1;
}
hostent * pHostIP;
if((pHostIP = gethostbyname(hostName))==NULL)
{
printf("gethostbyname failed\n");
return -1;
}
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);
if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in)) == SOCKET_ERROR)
{
printf("bind failed");
return -1;
}
DWORD dwValue=1;
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)
DWORD dwBufferLen[10];
DWORD dwBufferInLen=1;
DWORD dwBytesReturned=0;
if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),
&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,
NULL,NULL)==SOCKET_ERROR)
{
printf("ioctlsocket failed\n");
return -1;
}
#define BUFFER_SIZE 65535
char buffer[BUFFER_SIZE];
printf("开始解析经过本机的IP数据包! \n\n");
while(true)
{
int size=recv(sock,buffer,BUFFER_SIZE,0);
if(size > 0)
{
ipparse(stdout,buffer);
ipparse(file,buffer);
}
}
fclose(file);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -