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
/*以下是以太网协议格式的定义*/ 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)在线全文阅读。
相关推荐: