实例介绍
【实例简介】
MICROSOFT 基础类库: KSniffer 项目概述
应用程序向导已为您创建了这个 KSniffer 应用程序。此应用程序不仅演示 Microsoft 基础类的基本使用方法,还可作为您编写应用程序的起点。
本文件概要介绍组成 KSniffer 应用程序的每个文件的内容。
KSniffer.vcxproj
这是使用应用程序向导生成的 VC 项目的主项目文件。
它包含生成该文件的 Visual C 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
KSniffer.vcxproj.filters
这是使用“应用程序向导”生成的 VC 项目筛选器文件。
它包含有关项目文件与筛选器之间的关联信息。在 IDE 中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。例如,“.cpp”文件与“源文件”筛选器关联。
KSniffer.h
这是应用程序的主要头文件。它包括其他项目特定的头文件(包括 Resource.h),并声明 CKSnifferApp 应用程序类。
KSniffer.cpp
这是包含应用程序类 CKSnifferApp 的主要应用程序源文件。
KSniffer.rc
这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C 中进行编辑。项目资源位于 2052 中。
res\KSniffer.ico
这是用作应用程序图标的图标文件。此图标包括在主要资源文件 KSniffer.rc 中。
res\KSniffer.rc2
此文件包含不在 Microsoft Visual C 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。
/////////////////////////////////////////////////////////////////////////////
应用程序向导创建一个对话框类:
KSnifferDlg.h,KSnifferDlg.cpp - 对话框
这些文件包含 CKSnifferDlg 类。该类定义应用程序主对话框的行为。该对话框的模板位于 KSniffer.rc 中,该文件可以在 Microsoft Visual C 中进行编辑。
/////////////////////////////////////////////////////////////////////////////
其他功能:
ActiveX 控件
应用程序包括对使用 ActiveX 控件的支持。
/////////////////////////////////////////////////////////////////////////////
其他标准文件:
StdAfx.h,StdAfx.cpp
这些文件用于生成名为 KSniffer.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。
Resource.h
这是标准头文件,它定义新的资源 ID。
Microsoft Visual C 读取并更新此文件。
KSniffer.manifest
应用程序清单文件供 Windows XP 用来描述应用程序
对特定版本并行程序集的依赖性。加载程序使用此
信息从程序集缓存加载适当的程序集或
从应用程序加载私有信息。应用程序清单可能为了重新分发而作为
与应用程序可执行文件安装在相同文件夹中的外部 .manifest 文件包括,
也可能以资源的形式包括在该可执行文件中。
/////////////////////////////////////////////////////////////////////////////
其他注释:
应用程序向导使用“TODO:”指示应添加或自定义的源代码部分。
如果应用程序在共享的 DLL 中使用 MFC,则需要重新发布这些 MFC DLL;如果应用程序所用的语言与操作系统的当前区域设置不同,则还需要重新发布对应的本地化资源 MFC100XXX.DLL。有关这两个主题的更多信息,请参见 MSDN 文档中有关 Redistributing Visual C applications (重新发布 Visual C 应用程序)的章节。
/////////////////////////////////////////////////////////////////////////////
【实例截图】
【核心代码】
主函数
void main()
{
pcap_t *pcap_handle; /* Winpcap句柄 */
char error_content[PCAP_ERRBUF_SIZE]; /* 存储错误信息 */
char *net_interface; /* 网络接口 */
bpf_program bpf_filter; /* BPF过滤规则 */
char bpf_filter_string[] = ""; /* 过滤规则字符串 */
bpf_u_int32 net_mask; /* 掩码 */
bpf_u_int32 net_ip; /* 网路地址 */
net_interface = pcap_lookupdev(error_content); /* 获得可用的网络接口 */
pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址 */
pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content); /* 打开网路接口 */
pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip); /* 编译BPF过滤规则 */
pcap_setfilter(pcap_handle, &bpf_filter); /* 设置过滤规则 */
对IP协议的定义
class ip_header
{ public:
#if defined(WORDS_BIGENDIAN)
u_int8_t ip_version: 4, /* 版本 */
ip_header_length: 4; /* 首部长度 */
#else
u_int8_t ip_header_length: 4, ip_version: 4;
#endif
u_int8_t ip_tos; /* 服务质量 */
u_int16_t ip_length; /* 长度 */
u_int16_t ip_id; /* 标识 */
u_int16_t ip_off; /* 偏移 */
u_int8_t ip_ttl; /* 生存时间 */
u_int8_t ip_protocol; /* 协议类型 */
u_int16_t ip_checksum; /* 校验和 */
in_addr ip_souce_address; /* 源IP地址 */
in_addr ip_destination_address; /* 目的IP地址 */
pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */
分析UDP协议的函数代码
void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content)
{
class udp_header *udp_protocol; /* UDP协议变量 */
u_short source_port; /* 源端口 */
u_short destination_port; /* 目的端口号 */
u_short length; //长度
udp_protocol = (class udp_header*)(packet_content 14 20);/* 获得UDP协议内容 */
source_port = ntohs(udp_protocol->udp_source_port); /* 获得源端口 */
destination_port = ntohs(udp_protocol->udp_destination_port); /* 获得目的端口 */
length = ntohs(udp_protocol->udp_length); /* 获得长度 */
cout<<"---------- UDP协议 ----------"<<endl;
cout<<"源端口号:"<<dec<<source_port<<endl;
cout<<"目的端口号:"<<dec<<destination_port<<endl;
switch (destination_port)
{
case 138:
cout<<"上层协议为NETBIOS数据报服务"<<endl;
break;
case 137:
cout<<"上层协议为NETBIOS名字服务"<<endl;
break;
case 139:
cout<<"上层协议为NETBIOS会话服务"<<endl;
break;
case 53:
cout<<"上层协议为域名服务"<<endl;
break;
default:
break;
}
cout<<"长度:"<<length<<endl;
cout<<"校验和:"<<setw(4)<<setfill('0')<<hex<<ntohs(udp_protocol->udp_checksum)<<endl;
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论