77范文网 - 专业文章范例文档资料分享平台

基于Winpcap 编程实现抓包实验(2)

来源:网络收集 时间:2020-04-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

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<<\协议 ----------\ cout<<\源端口号:\

cout<<\目的端口号:\ switch (destination_port) {

case 138:

cout<<\上层协议为NETBIOS数据报服务\ break; case 137:

cout<<\上层协议为NETBIOS名字服务\ break; case 139:

cout<<\上层协议为NETBIOS会话服务\ break; case 53:

cout<<\上层协议为域名服务\ break; default: break; }

cout<<\长度:\ cout<<\校验和:\

}

五.参考文献

(1) Winpcap中文文档 (2) 网络资料

http://wenku.http://www.wodefanwen.com//view/d64047d676eeaeaad1f330c7.html?from=searchhttp://www.programlife.net/winpcap-sniffer.html

完整源程序

#include \#include #include #include using namespace std;

/*以下是以太网协议格式的定义*/ class ether_header { public:

u_int8_t ether_dhost[6]; /* 目的以太网地址 */ u_int8_t ether_shost[6]; /* 源以太网地址 */ u_int16_t ether_type; /* 以太网类型 */ };

/* 下面是ARP协议格式的定义*/ class arp_header

{ public:

u_int16_t arp_hardware_type; /* 硬件类型 */ u_int16_t arp_protocol_type; /* 协议类型 */ u_int8_t arp_hardware_length; /* 硬件地址长度 */ u_int8_t arp_protocol_length; /* 协议地址长度 */ u_int16_t arp_operation_code; /* 操作码 */

u_int8_t arp_source_ethernet_address[6]; /* 源以太网地址 */ u_int8_t arp_source_ip_address[4]; /* 源IP地址 */

u_int8_t arp_destination_ethernet_address[6]; /* 目的以太网地址 */ u_int8_t arp_destination_ip_address[4]; /* 目的IP地址 */ };

/*下面是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地址 */ };

/*下面是UDP协议格式定义*/ class udp_header { public:

u_int16_t udp_source_port; /* 源端口号 */

u_int16_t udp_destination_port; /* 目的端口号 */ u_int16_t udp_length; /* 长度 */ u_int16_t udp_checksum; /* 校验和 */ };

/* 下面是TCP协议格式的定义*/ class tcp_header { public:

u_int16_t tcp_source_port; /* 源端口号 */

u_int16_t tcp_destination_port; /* 目的端口号 */

u_int32_t tcp_sequence_lliiuuwweennttaaoo; /* 序列号 */ u_int32_t tcp_acknowledgement; /* 确认序列号 */ #ifdef WORDS_BIGENDIAN

u_int8_t tcp_offset: 4, /* 偏移 */ tcp_reserved: 4; /* 未用 */ #else

u_int8_t tcp_reserved: 4, /* 未用 */ tcp_offset: 4; /* 偏移 */ #endif

u_int8_t tcp_flags; /* 标记 */

u_int16_t tcp_windows; /* 窗口大小 */ u_int16_t tcp_checksum; /* 校验和 */

u_int16_t tcp_urgent_pointer; /* 紧急指针 */ };

/* 下面是ICMP协议格式的定义*/ class icmp_header { public:

u_int8_t icmp_type; /* ICMP类型 */ u_int8_t icmp_code; /* ICMP代码 */ u_int16_t icmp_checksum; /* 校验和 */ u_int16_t icmp_id; /* 标识符 */

u_int16_t icmp_sequence; /* 序列码 */ };

/* 下面是分析TCP协议的函数,其定义方式与回调函数相同 */

void tcp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content)

{

class tcp_header *tcp_protocol;/* TCP协议变量 */ u_char flags; /* 标记 */ int header_length; /* 长度 */ u_short source_port; /* 源端口 */

u_short destination_port; /* 目的端口 */ u_short windows; /* 窗口大小 */

u_short urgent_pointer;/* 紧急指针 */ u_int sequence; /* 序列号 */

u_int acknowledgement; /* 确认号 */ u_int16_t checksum; /* 校验和 */

tcp_protocol = ( tcp_header*)(packet_content + 14+20); /* 获得TCP协议内容 */

source_port = ntohs(tcp_protocol->tcp_source_port); /* 获得源端口 */ destination_port = ntohs(tcp_protocol->tcp_destination_port); /* 获得目的端口 */

header_length = tcp_protocol->tcp_offset *4; /* 长度 */

sequence = ntohl(tcp_protocol->tcp_sequence_lliiuuwweennttaaoo); /* 序列码 */

acknowledgement = ntohl(tcp_protocol->tcp_acknowledgement); /* 确认序列码 */

windows = ntohs(tcp_protocol->tcp_windows); /* 窗口大小 */

urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer); /* 紧急指针 */

flags = tcp_protocol->tcp_flags; /* 标识 */

checksum = ntohs(tcp_protocol->tcp_checksum); /* 校验和 */ cout<<\协议 \ cout<<\源端口号:\

cout<<\目的端口号:\ switch (destination_port) {

case 80:

cout<<\上层协议为HTTP协议:\ break; case 21:

cout<<\上层协议为FTP协议\ break; case 23:

cout<<\上层协议为TELNET协议\ break; case 25:

cout<<\上层协议为SMTP协议\ break; case 110:

cout<<\上层协议为POP3协议\ break; default: break; }

cout<<\序列码\

cout<<\确认号:\

cout<<\首部长度:\

cout<<\保留:\ cout<<\标记:\ if (flags &0x08)

cout<<\ if (flags &0x10)

cout<<\ if (flags &0x02)

cout<<\ if (flags &0x20)

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于Winpcap 编程实现抓包实验(2)在线全文阅读。

基于Winpcap 编程实现抓包实验(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/1006361.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: