关于抓包效率的有关问题,解决马上给分

关于抓包效率的问题,解决马上给分!
我要抓取指定的组播报文,并将各个组播组的报文分开存放。直接使用混杂模式肯定是不行的了,效率太低下。
于是我用的NDIS_PACKET_TYPE_ALL_MULTICAST参数,也就是抓去所有组播报文,然后再对每个报文的目的地址进行比对,看是否是我需要的组播报文。

这样做如果只有2个组播组,并且流量不大(3~5M)还能过的去。
但是如果有3个、4个更多组播组,并且流量都比较大时(3~5M),系统(我写的软件)就会处理不过来而丢包了。

现在不知道怎么做了,请大家看看:
while(1){
//   接收组播流
if(PacketReceivePacket(pthis-> m_recivedriver.m_lpadapter,pthis-> m_recivedriver.m_lppackets,TRUE)==FALSE)
{
                              continue;
}
//数据其始位置
capbuf=(char   *)(pthis-> m_recivedriver.m_lppackets-> Buffer);
//匹配到IP头
piphead=(ip_header   *)(capbuf+34);//20字节的头,14字节的以太网头
//比较组播地址
if(piphead-> destIP   !=inet_addr   (pthis-> m_smultiip))
                  continue;
//长度不对则跳过
if(pthis-> m_recivedriver.m_lppackets-> ulBytesReceived!=1380)
continue;
//移位,隔离出头部长度,只取组播的TS包//20+14+20+8:eth+ip+udp
capbuf=capbuf+62;
//内存拷贝报文
...........
          }

------解决方案--------------------
1、尽量减少复杂的判断逻辑
2、同种判断条件要用占用cpu指令少的写法
------解决方案--------------------
//内存拷贝报文

个人看法是这里效率低了


------解决方案--------------------
不管你如何优化,这种抓包方式都要进行两次数据拷贝
一次是网卡--> 操作系统
一次是操作系统--> 你的应用程序


在Linux开发中,可以使用一种“零拷贝”技术,是通过修改网卡驱动达到DMA效果的。
可以参考一下。
------解决方案--------------------
我能看到的优化建议是:

1 :还是觉得“copy到一个队列”效率低了

PacketReceivePacket(pthis-> m_recivedriver.m_lpadapter,pthis-> m_recivedriver.m_lppackets,TRUE)

先从驱动copy了一次报文到pthis-> m_recivedriver.m_lppackets这个缓存

然后创建一个线程处理这个报文的缓存时候,看lz的意思是又copy了一次报文,然后由线程来处理

这样明显效率低

应该去掉第二次copy,每次接受报文时都创建一个新的缓存,然后让线程直接处理这个缓存,去掉copy的步骤

2 :使用线程池,使用多线程的话,接收新报文时就新建线程,报文处理结束就结束线程,会产生额外的线程调度开销