pcap_捕获以太网数据包(二)

本文示例展示了如何利用pcap_loop函数捕获以太网数据包,并通过回调函数pcap_packet_call_back进行分析,识别IP、ARP、RARP等协议。程序中包含了创建过滤器、解析MAC地址和网络层协议等内容。

 这个例子和上个例子一样,功能是捕获数据包,并分析其属于IP, ARP, RARP还是其他。与上个例子不同的是这个例子中采用pcap_loop()作为捕包函数,同时调用回调函数pcap_packet_call_back()对数据包进行分析。

/********************************************************************************
 *      file name :     get_ethernet2_code.c                                    *
 *      writer    :     starshift                                               *
*********************************************************************************/

#include <pcap.h>
struct ether_header
{
        u_int8_t        ether_dhost[6];
        u_int8_t        ether_shost[6];
        u_int16_t       ether_type;
};


/*      call back fuction*********************/

void ethernet_protocol_packet_callback( u_char *argument, const struct pcap_pkthdr *packet_header, const u_char* packet_content)
{

WinPcap是一个网络包捕获库,它允许开发者直接访问网络接口的数据包。` pcap_sendqueue_transmit ` 是 WinPcap 提供的一个函数,用于将自定义的数据包添加到发送队列中,然后等待合适的时机由底层驱动程序发送出去。 以下是一个简单的例子,展示了如何使用 ` pcap_sendqueue_transmit ` 创建并发送一个自定义的以太网数据包: ```c++ #include <pcap.h> #include <pcap_pkthdr.h> #include <u_char.h> // 定义自定义的数据包结构 struct CustomPacket { struct ether_header eth; // 以太头信息 u_int8_t custom_data[100]; // 自定义数据部分 }; int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_if_t *dev_list = NULL; pcap_t *handle = NULL; // 打开第一个网络设备 if (pcap_findalldevs(&dev_list, errbuf) == -1) { printf("Error: %s\n", errbuf); return -1; } // 获取第一个设备句柄 if ((handle = pcap_open_live(dev_list->name, BUFSIZ, 1, -1, errbuf)) == NULL) { printf("Error: %s\n", errbuf); freealldevs(dev_list); return -1; } freealldevs(dev_list); // 注意释放设备列表 // 创建一个以太头部 CustomPacket packet; bzero(&packet.eth, sizeof(packet.eth)); packet.eth.h_dest = etherbroadcastaddr; // 目标地址设为广播地址 packet.eth.h_source = my_mac_address; // 源地址设置为你本地的MAC packet.eth.type = ETHERTYPE_IP; // 数据类型设置为IP包 // 将自定义数据填充到数据区 memset(packet.custom_data, 0x42, 100); // 示例,设置成固定值 // 构造pcap_pkthdr结构体 pcap_pkthdr header; header.ts.tv_sec = time(NULL); header.ts.tv_usec = 0; header.len = sizeof(CustomPacket); // 使用pcap_sendqueue_transmit发送数据包 if (pcap_sendpacket(handle, &header, &packet, sizeof(packet)) != 0) { printf("Error sending packet: %s\n", pcap_geterr(handle)); } else { printf("Sent packet successfully.\n"); } // 关闭设备 pcap_close(handle); return 0; } ``` 这个示例中,我们首先打开网络设备,然后创建一个自定义的以太网数据包,并通过 `pcap_sendpacket` 或 `pcap_sendqueue_transmit` 函数将其放入发送队列。注意实际应用中需要替换 `my_mac_address` 和 `etherbroadcastaddr` 为实际的MAC地址和广播地址。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值