wincap数据包发送1

本文详细介绍了如何利用wpcap.dll库进行数据包的发送,包括其导出的函数接口以及如何实现单个数据包的发送示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NPF 允许把原始数据包发送到网络上,而且针对不同的应用提供了下列四种发送方式:
n         应用软件每次发送一个数据包一次;
n         应用软件每次发送一个数据包大于一次,次数预先设定;
n         应用软件每次发送一个数据包队列,并根据时间戳发送各数据包;
n         应用软件每次发送一个数据包队列,不根据时间戳,而是尽所能得快速发送各数据包;
数据包被发送到网络时, NPF 并不对数据包作任何协议封装,因此应用程序必须构建每个数据包的不同协议头。一般情况下应用程序不需要生成 FCS ,它通常由网络适配器硬件计算,并在发送到网络前自动添加到每个数据包的尾部。
9-1 函数调用关系图

1.1      wpcap.dll导出的相应函数接口

wpcap.dll 为了完成数据包发送的任务,提供了下列函数:
int pcap_sendpacket(pcap_t *p,u_char *    buf,int size);
函数发送单个原始数据包一次
pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);
函数分配一个发送队列
void pcap_sendqueue_destroy(pcap_send_queue *queue);
函数销毁一个发送队列,释放与队列相关的所有内存资源
int pcap_sendqueue_queue(pcap_send_queue *queue,const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);
函数把一个数据包添加到 queue 参数所指发送队列的尾部
u_int pcap_sendqueue_transmit(pcap_t *p,pcap_send_queue *queue,int sync)
函数发送一个原始数据包队列到网络

1.2      发送单个数据包的示例

我们采用实际代码演示如何通过 pcap_sendpacket 函数发送单个数据包。示例代码如下: [send工程]
#define WIN32
#define HAVE_REMOTE
 
#include <stdio.h>
#include "pcap.h"
#include "Win32-Extensions.h"
 
void genPacket(unsigned char *buf,int len);
 
int main()
{
    pcap_if_t *alldevs;
    pcap_if_t *d;
    int inum;
    int i=0;
    pcap_t *adhandle;
    char errbuf[PCAP_ERRBUF_SIZE];
    int ret=-1;
   
    /* 获取本机网络设备列表 */
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,
PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL,errbuf) )
== NULL)
    {
        fprintf(stderr,"/nUnable to open the adapter.
%s is not supported by WinPcap/n" , d->name);
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        return -1;
    }
 
    /* 在选中的设备接口上监听数据 */
    printf("/nlistening on %s.../n", d->description);
   
 
   
    /* 开始数据包发送 */    
    int MaxPacketLen=100;
    unsigned char *pBuf= (unsigned char *)malloc(MaxPacketLen);
    memset(pBuf,0x0,MaxPacketLen);
// 获得生成的数据包,长度为 MaxPacketLen
    genPacket(pBuf,MaxPacketLen);
 
    if ( (ret=pcap_sendpacket(adhandle,pBuf,MaxPacketLen))
==-1)
    {
       printf(" 发送失败 /n" );
       pcap_close(adhandle);
        pcap_freealldevs(alldevs);
        return -1;
    }
 
 
     /* 释放资源 */
     free(pBuf);
     pcap_close(adhandle);
     pcap_freealldevs(alldevs);
   
    return 0;
}
其中函数genPacket负责生成数据包,参数buf用来保存所生成数据包的内容,len为要求深成数据包的长度。该函数所生成的数据包没有任何实际意义,仅仅为了演示。函数源代码如下:
void genPacket(unsigned char *buf,int len)
{
       int i=0;
       // 设置目标 MAC 地址为 :01:01:01:01:01
       for (i=0;i<6;i++)
       {
           buf[i]=0x01;
       }
       // 设置源 MAC 地址为 :02:02:02:02:02
       for (i=6;i<12;i++)
       {
           buf[i]=0x02;
       }
       // 设置协议标识为 xc0xd ,无任何实际意义
       buf[12]=0xc;
       buf[13]=0xd; 
       // 填充数据包的内容  
       for(i=14;i<len;i++)
       {         
           buf[i]=i-14;
       }
}
Wireshark 接收示例程序所发送的数据包如图 9-2 所示。
9-2 Wireshark所接收的数据包
标 题: 【原创】基于WinPCap网络协议开发 - 炮王(超级打炮机)发送数据包(03) 作 者: 加百力 时 间: 2009-05-18,16:55:36 链 接: http://bbs.pediy.com/showthread.php?t=89175 【文章标题】: 基于WinPCap网络协议开发 - 炮王(超级打炮机)发送数据包(03) 【文章作者】: 加百力 【软件名称】: WinPCap 【下载地址】: http://www.winpcap.org/ 【内部编号】: MASSADA 0029 【编写语言】: C++ 【使用工具】: VS2005 【操作平台】: Windows 2003 -------------------------------------------------------------------------------- 【详细过程】 在第一篇文章中我们提到WinPCap的基本功能之一就是:  1> 在网络发送原始的数据包发送原始数据包难度不大,只需要应用几个简单的函数就可以了。 我编写炮王程序的主要目的是为了测试WinPCap/libpcap的抓包能力,在不同网速和数据包大小的条件下libpcap的抓包率有多少。 炮王特点: 01、可以发送任意协议的数据包。TCP/IP等等。 02、针对每次发包,会返回状态,可以检测是否成功。在程序中如果失败会自动退出。 03、可以随机修改数据包的:源、目的MAC地址,IP地址,端口、数据内容等属性信息。 04、使用多线程发包,在XP下最多可以同时开2000个线程发包,发包速度快,流量大。在千兆网卡上可以超过15M/s的速度。 05、自动统计发包时间,计算每秒发包数量,流量。 06、可以设置发包的时间间隔,最少到1毫秒。 炮王使用方法: 首先直接运行pw.exe可以看到程序提示的参数信息和显示的当前可用网卡信息。可用网卡信息会保存在CardsInfo.txt文件中。 打开BAT脚本,修改网卡信息,即可。 运行脚本,脚本将数据包文件发送出去。 注意:总的发包数量等于每个线程的发包数量乘以线程总数。 实验的数据包文件都是MSN消息。 具体代码请看附件。 -------------------------------------------------------------------------------- 【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值