千家信息网

分析数据包(Microsoft Visual Studio 2010)

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,// Fenxi1.cpp : 定义控制台应用程序的入口点。//代码如下:#include "stdafx.h"#include "pcap.h"#include "bittypes.h"#pragm
千家信息网最后更新 2026年10月31日分析数据包(Microsoft Visual Studio 2010)

// Fenxi1.cpp : 定义控制台应用程序的入口点。
//
代码如下:
#include "stdafx.h"
#include "pcap.h"
#include "bittypes.h"
#pragma comment(lib,"ws2_32.lib")
typedef struct ip_address{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;

/* IPv4 首部 */
typedef struct ip_header{
u_char ver_ihl; // 版本 (4 bits) + 首部长度 (4 bits)
u_char tos; // 服务类型(Type of service)
u_short tlen; // 总长(Total length)
u_short identification; // 标识(Identification)
u_short flags_fo; // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
u_char ttl; // 存活时间(Time to live)
u_char proto; // 协议(Protocol)
u_short crc; // 首部校验和(Header checksum)
ip_address saddr; // 源地址(Source address)
ip_address daddr; // 目的地址(Destination address)
u_int op_pad; // 选项与填充(Option + Padding)
}ip_header;

/* UDP 首部*/
typedef struct udp_header{
u_short sport; // 源端口(Source port)
u_short dport; // 目的端口(Destination port)
u_short len; // UDP数据包长度(Datagram length)
u_short crc; // 校验和(Checksum)
}udp_header;

/* 回调函数原型 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

int _tmain(int argc, _TCHAR* argv[])
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "ip and udp";
struct bpf_program fcode;

/* 获得设备列表 */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 打印列表 */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);

if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}

/* 跳转到已选设备 */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* 打开适配器 */
if ( (adhandle= pcap_open(d->name, // 设备名
65536, // 要捕捉的数据包的部分
// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}

/* 检查数据链路层,为了简单,我们只考虑以太网 */
if(pcap_datalink(adhandle) != DLT_EN10MB)
{
fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}

if(d->addresses != NULL)
/* 获得接口第一个地址的掩码 */
netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
/* 如果接口没有地址,那么我们假设一个C类的掩码 */
netmask=0xffffff;


//编译过滤器
if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
{
fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}

//设置过滤器
if (pcap_setfilter(adhandle, &fcode)<0)
{
fprintf(stderr,"\nError setting the filter.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
printf("蒋教寿:1306404018");
printf("\nlistening on %s...\n", d->description);

/* 释放设备列表 */
pcap_freealldevs(alldevs);

/* 开始捕捉 */
pcap_loop(adhandle, 0, packet_handler, NULL);

return 0;
}

/* 回调函数,当收到每一个数据包时会被libpcap所调用 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
char timestr[16];
ip_header *ih;
udp_header *uh;
u_int ip_len;
u_short sport,dport;
time_t local_tv_sec;

/* 将时间戳转换成可识别的格式 */
local_tv_sec = header->ts.tv_sec;
ltime=localtime(&local_tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

/* 打印数据包的时间戳和长度 */
printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);

/* 获得IP数据包头部的位置 */
ih = (ip_header *) (pkt_data +
14); //以太网头部长度

/* 获得UDP首部的位置 */
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header *) ((u_char*)ih + ip_len);

/* 将网络字节序列转换成主机字节序列 */
sport = ntohs( uh->sport );
dport = ntohs( uh->dport );

/* 打印IP地址和UDP端口 */
printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d\n",
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
sport,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4,
dport);
}

项目-->**属性(alt+F7)
配置属性-->C/C++-->常规-->附加包含目录-->(是把头文件所在的文件路径(Include)添加到附加目录中C:\WpdPack\Include)


项目-->**属性(alt+F7)
配置属性-->链接器-->常规-->附加库目录-->(是把Packet.lib;wpcap.lib所在目录(Lib)添加到附加库目录中C:\WpdPack\Lib)


项目-->**属性(alt+F7)
配置属性-->链接器-->输入-->附加依赖项-->补充";Packet.lib;wpcap.lib"

项目-->**属性(alt+F7)
配置属性-->C/C++-->预处理器-->预处理器定义-->补充";HAVE_REMOTE"

加头部如下

#include "pcap.h"
#include "bittypes.h"
#pragma comment(lib,"ws2_32.lib")

下面是获取的结果图:


设备 数据 属性 地址 目录 附加 时间 长度 项目 配置 端口 以太网 位置 函数 头部 字节 常规 序列 所在 接口 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技垄断 工业互联网科技新基建 科技信息互联网 互联网未来科技 成都互联网科技公司 丰台科技园 互联网公司 青岛中康互联网医疗科技有限公司 湖北码尼互联网科技有限公司电话 成都互联网科技公司工作好不好 想开互联网科技公司怎么样 互联网金融科技展 洛阳共同富裕互联网科技有限公司 互联网行业科技股 银行科技岗属于互联网吗 有人说阿里系是互联网科技企业 下一代互联网重大应用科技园 广州有谷有贝互联网科技有限公司 云鲸互联网络科技有限公司 保山浩联互联网科技有限公司 科技美学互联网 艺术 互联网的科技 鸠鸠互联网科技 智能科技公司是互联网公司吗 互联网科技热点资讯 互联网时代科技改变生活 语蝶互联网科技有限公司 张召忠谈中国互联网科技 互联网科技快讯热点 易企秀互联网科技是做什么的 杭州科技互联网公司有哪些
0