求助,vs2017的error C2065: “FILE”: 未声明的标识符
代码如下:#include
#include"pch.h"
#include
#include
//#include
#include
//#include
#define WIN32_LEAN_AND_MEAN
#include
#include
//#include
//#include
#include
#pragma comment(lib, “wsock32.lib”)
#pragma comment(lib,“ws2_32.lib”)
#define BUFSIZE 10240
#define STRSIZE 1024
typedef long bpf_int32;
typedef unsigned long bpf_u_int32;
typedef unsigned short u_short;
typedef unsigned long u_int32;
typedef unsigned short u_int16;
typedef unsigned char u_int8;
//pacp文件头结构体(24B)
typedef struct pcap_file_header
{
bpf_u_int32 magic; //4B,用来标识文件的开始
u_short version_major; //2B,当前文件主要的版本号
u_short version_minor; //2B,当前文件次要的版本号
bpf_int32 thiszone; //4B,当地的标准时间;全零
bpf_u_int32 sigfigs; //4B,时间戳的精度,全零
bpf_u_int32 snaplen; //4B,最大的存储长度
bpf_u_int32 linktype; //4B,链路类型
}pcap_file_header;
//时间戳
typedef struct time_val
{
long tv_sec;; //时间戳高位,精确到seconds
long tv_usec;; //时间戳低位,精确到microseconds
}timestamp;
//pcap数据包头结构体
typedef struct pcap_pkthdr
{
timestamp ts;
bpf_u_int32 caplen; //当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的长度
bpf_u_int32 len; //离线数据长度,网络中实际数据帧的长度,一般不大于caplen,多数情况下两者相等
}pcap_pkthdr;
//数据帧头
typedef struct FramHeader_t
{ //Pcap捕获的数据帧头
u_int8 DstMAC[6]; //目的MAC地址
u_int8 SrcMAC[6]; //源MAC地址
u_short FrameType; //帧类型
}FramHeader_t;
//IP数据报头
typedef struct IPHeader_t
{ //IP数据报头
u_int8 Ver_HLen; //版本+报头长度
u_int8 TOS; //服务类型
u_int16 TotalLen; //总长度
u_int16 ID; //标识
u_int16 Flag_Segment; //标志+片偏移
u_int8 TTL; //生存周期
u_int8 Protocol; //协议类型
u_int16 Checksum; //头部校验和
u_int32 SrcIP; //源IP地址
u_int32 DstIP; //目的IP地址
}IPHeader_t;
//ICMP报头
typedef struct ICMPHeader_t
{
BYTE type; //8位类型字段
BYTE code; //8位代码字段
USHORT cksum; //16位校验和
USHORT id; //16位标识符
USHORT seq; //16位序列号
}ICMPHeader_t;
//void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len);
//查找 http 信息函数
int main()
{
pcap_file_header *file_header;
pcap_pkthdr *ptk_header;
IPHeader_t *ip_header;
ICMPHeader_t *icmp_header;
FILE *fp;
FILE *output;
int pkt_offset, i = 0;
int num = 0; //计数icmp包
int ip_len, ip_proto;
char buf[BUFSIZE], my_time[STRSIZE];
char src_ip[STRSIZE], dst_ip[STRSIZE];
//初始化
file_header = (struct pcap_file_header *)malloc(sizeof(pcap_file_header));
ptk_header = (struct pcap_pkthdr *)malloc(sizeof(pcap_pkthdr));
ip_header = (IPHeader_t *)malloc(sizeof(IPHeader_t));
icmp_header = (ICMPHeader_t *)malloc(sizeof(ICMPHeader_t));
memset(buf, 0, sizeof(buf));
if ((fp = fopen("Tracert www.cqupt.edu.cn.pcap", "rb")) == NULL)
{
printf("error: can not open pcap file\n");
exit(0);
}
if ((output = fopen("icmp_2016210456.pcapng", "wb")) == NULL)
{
printf("error: can not open output file\n");
exit(0);
}
//开始读数据包
pkt_offset = 24; //pcap文件头结构24个字节
while (fseek(fp, pkt_offset, SEEK_SET) == 0) //遍历数据包 fseek:将位置指针移到离文件头n字节处。
{
i++; //pcap_header 16B
if (fread(ptk_header, 16, 1, fp) != 1) //读pcap数据包头结构
{
printf("\nread end of pcap file\n");
break;
}
pkt_offset = pkt_offset + (16 + ptk_header->caplen); //下一个数据包的偏移
fseek(fp, 14, SEEK_CUR); //忽略数据帧头14个字节
if (fread(ip_header, sizeof(IPHeader_t), 1, fp) != 1) //IP数据报头20个字节
{
printf("%d:can not read ip_header\n", i);
break;
}
ip_proto = ip_header->Protocol;
if (ip_proto == 1) //判断是否是icmp协议
{
if (fread(icmp_header, sizeof(ICMPHeader_t), 1, fp) != 1)
{
printf("%d: can not read ip_header\n", i);
break;
}
inet_ntop(AF_INET, (void *)&(ip_header->SrcIP), src_ip, 16); //将数值格式转化为点分十进制的ip地址格式
inet_ntop(AF_INET, (void *)&(ip_header->DstIP), dst_ip, 16);
printf("源IP %d:src=%s\n", i, src_ip);
printf("目标IP %d:dst=%s\n", i, dst_ip);
//printf("源IP地址:%s\n", inet_ntoa(ip_header->SrcIP));
//printf("目的IP地址:%s\n", inet_ntoa(ip_header->SrcIP));
printf("协议类型:%d\n", ip_proto);
num++;
}
}
printf("主机相关icmp包的个数:%d\n", num);
fclose(fp);
fclose(output);
return 0;
}
程序目的:从pcap文件中抓出icmp包并存盘
我用vs2010运行没有问题,用vs2017就有一大堆报错