运行完,没有结果,这是什么原因?
运行之后,是这样的:
没有结果,这是什么原因?
代码如下:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535
//定义IP头部数据结构
typedef struct _IP_HEADER //定义IP头
{
union
{
BYTE Version; //版本(前四位)
BYTE HdrLen; //报头标长(后四位),IP头长度
};
BYTE ServiceType; //服务类型
WORD TotalLen; //总长度
WORD ID; //标志
union
{
WORD Flags; //标识(前3位)
WORD FragOff; //分段偏移(后13位)
};
BYTE TimeToLive; //生存时间
BYTE Protocol; //协议
WORD HdrChksum; //首部检验和
DWORD SrcAddr; //源地址
DWORD DstAddr; //目的地址
BYTE Options;
}IP_HEADER;
//逐位解析IP头中的信息,获取版本号
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 "Flsah";
break;
case 2:
return "Immediate";
break;
case 1:
return "Priority"; //协议
break;
case 0:
return "Routine"; //路由
break;
default:
return "Unknow";
break;
}
}
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 "Unknow";
}
}
//获取禁止分片标志和分片标志
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) //获取协议字段共8位
{
switch(Protocol) //以下为协议号说明
{
case 1:
return "ICMP"; //Internet控制报文协议
case 2:
return "IGMP"; //Internet组管理协议
case 4:
return "IP in IP"; //移动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"; //Open Shortest Path First开发式最短路径优先
default:
return "UNKNOW";
}
}
// 解析IP数据包
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,"版本号:IPv%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,"标识=%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(hopes)\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 nRetCode=0;
{
FILE * file;
if((file=fopen("history.txt","wb+"))==NULL)
{
printf("fail to open file %s");
return -1;
}
WSADATA wsData;/* 启动2.2版本的Socket,并将Socket版本信息保存到wsData中 */
WSAStartup(MAKEWORD(2,2),&wsData);
SOCKET sock;/* 创建原始套接字 */
sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
BOOL flag=TRUE;/* 设置IP头操作选项 */
setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
char hostName[128];/* 获取本地主机名 */
gethostname(hostName,100);
hostent * pHostIP;/* 根据主机名获取主机信息 */
pHostIP=gethostbyname(hostName); /* 封装IP地址信息 */
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);
bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
DWORD dwValue=1;
DWORD dwBufferLen[10];
DWORD dwBufferInLen=1;
DWORD dwBytesReturned=0;
WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),
&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
char buffer[BUFFER_SIZE];
printf("请输入命令符ParsePacket开始抓包!\n");
char a[20];
gets(a);
if(strcmp(a,"ParsePacket")==0)
{
printf("开始解析经过本机的IP数据包,请耐心等待,如果没反应,可能网络未连接,解析较慢!\n");
while(true)
{
int size=recv(sock,buffer,BUFFER_SIZE,0);
if (size>0)
{
printf("\n\nIP数据包捕获解析程序\n");
ipparse(stdout,buffer);
ipparse(file,buffer);
printf("请选择是否继续(1:继续;2:退出)?\n");
char b[20];
gets(b);
if(strcmp(b,"1")==0)
{
ipparse(stdout,buffer);
ipparse(file,buffer);
}
else
{
return 0;
}
}
}
fclose(file);
return 0;
}
else
{
printf("您的输入有误,请退出后重新打开本程序!\n");
system("pause");
}
}
return nRetCode;
}