深度剖析WinPcap之(九)——数据包的发送过程(2)
2009-10-17 00:00:00 来源:WEB开发网1.2 使用发送队列发送数据包的实例
我们采用实际代码演示如何通过pcap_sendqueue_transmit函数发送大量数据包。
在main()函数中选择适合的适配器send_dev->name,确定发送数据包的个数npacks为200,与每个数据包之间的时间间隔dus为30微秒,然后调用应用程序的send_queue函数发送数据包。
send_queue(send_dev->name,npacks,dus);
函数send_queue的主要代码如下:
void send_queue(char *dev,unsigned int npacks,unsigned int dus)
{
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
int i;
unsigned int res;
//打开输出设备
if ( (fp= pcap_open(dev, // 设备名
100, // 要捕获的部分 (只捕获前100个字节)
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲
) ) == NULL)
{
fprintf(stderr,"\n不能打开适配器. %s 不被WinPcap支持\n", dev);
return;
}
//发送数据包
pcap_send_queue *squeue; //发送队列
const int MaxPacketLen=100; //数据包长度
struct pcap_pkthdr mpktheader; //数据包的包头
struct pcap_pkthdr *pktheader;
pktheader=&mpktheader;
timeval tv; //时间戳
tv.tv_sec=0;
tv.tv_usec=0;
//分配发送队列
squeue=pcap_sendqueue_alloc(
(unsigned int)((MaxPacketLen+sizeof(struct pcap_pkthdr))*npacks) );
//用数据包填充发送队列
unsigned char *pBuf=new unsigned char[MaxPacketLen];
for(i=0;i<npacks;i++)
{
memset(pBuf,0x0,MaxPacketLen);
genPacket(pBuf,MaxPacketLen); //获得生成的数据包,长度为MaxPacketLen
//设置数据包的包头
pktheader->ts=tv;
pktheader->caplen = MaxPacketLen;
pktheader->len = MaxPacketLen;
if (pcap_sendqueue_queue(squeue, pktheader, pBuf) == -1)
{
printf("警告: 数据包缓冲区太小,不是所有的数据包被发送.\n");
break;
}
add_stamp(&tv,dus); //增加时间戳
pktheader->ts=tv; //更新数据包头的时间戳
}
delete [] pBuf;
//发送数据包
if ((res = pcap_sendqueue_transmit(fp, squeue, 1)) < squeue->len)
{
printf("发送数据包时出现错误:%s. 仅%d字节被发送\n",
pcap_geterr(fp), res);
}
//释放发送队列
pcap_sendqueue_destroy(squeue);
//关闭输出设备
pcap_close(fp);
return;
}
- ››深度解释攻击linux服务器的四种级别
- ››剖析java.util.concurrent锁
- ››剖析Android智能手机系统的更多功能
- ››深度分析地方社区网站的内容定位
- ››剖析Windows Azure Platform框架与组成
- ››剖析使用 ObjectOutputStream 可能引起的内存泄漏...
- ››剖析EWebEditor编辑器漏洞攻击案例
- ››剖析开源云:构建 Infrastructure as a Service 块...
- ››深度剖析 Android 和 iPhone OS
- ››深度分析:HTML5能否成为Flash终结者
- ››深度挖掘 更多Windows 7快捷模式
- ››深度挖掘 Windows 7快捷模式
赞助商链接