2)获得系统中网络适配器的名字。 PacketGetAdapterNames(AdapterNamea,&AdapterLength); tempa=AdapterNamea; templa=Adapternamea; while ((*tempa!=’\0’)∣∣(*tempa-1!=’\0)) { if (*tempa= =’\0’) { memcpy(AdapterList[i],temla,tempa-templa); //内存数据拷贝 templa=tempa+1; i++ } tempa++ } 3)从适配器列表中选择一个默认的 0 号适配器。 LPADAPTER lpAdapter lpAdapter = PacketOpenAdapter (AdapterList[0]); if (!lpAdapter∣∣(lpAdapter->hFile==INVALID__HANDLE__VALUE)) { dwErrorCode=GetLastError(); return FALSE; } 4)将所选择的适配器 lpAdapter 设置为混杂模式。 PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS) 5)设置 BPF 内核中包过滤的过滤器的代参政。利用这个函数右以完成对于原始数据包的初始的过滤处理,如根据其中端口号、IP 地址等。 PacketSetBpf(LpAdapter AdapterObject,structbpf_program*fp) 6)设置缓冲池为512K字节。 PacketSetBuff(lpAdapter,512000); 7)分配一个数据包对象,并连接已分配的缓冲。 PacketInitPacket(lpPacket,(char*)bufferReceive,512000); 8)捕获多个数据包。从网卡 lpAdapter 接收数据包,并将数据包放入 lpPacket所指向的数据包结构体中,若接收成功返回 TRUE,否则返回 FALSE。 PacketReceivePacket(lpAdapter,lpPacket,TRUE); 9)通过触发回调函数,把捕获符合过滤器规则的数据包转发给网络协议分析模块进行分析处理。 10) 结束接收数据包,释放数据包对象。 if(lpPacket!=NULL { PacketFreePacket(lpPacket); lpPacket=NULL; } 11)关闭网卡设备,将网卡恢复到正常接收状态。 if(lpAdapter!=NULL { PacketCloseAdapter(lpAdapter); lpAdapter=NULL; }
6、结束语 数据包捕获技术是网络管理系统的关键技术,已经按照标题4中的流程进行了简单的实现。如果在一个繁忙的网络上进行截获,而不设置任何过滤,那得到的数据包是非常多的,可能在一秒钟内得到上千的数据包。如果应用程序不进行必要的性能优化,那么将会大量的丢失数据包。对捕包性能的优化必不可少,考虑采用多线程来处理数据包。若在程序中建立一个公共的数据包缓冲池,这个缓冲池是一个LILO的队列。于是在程序中使用三个线程进行操作:一个线程只进行捕获操作,它将从驱动程序获得的数据包添加到数据包队列的头部;另一个线程只进行过滤操作,它检查新到的队尾的数据包,检查其是否满足过滤条件,如果不满足则将其删除出队列;最后一个线程进行数据包处理操作,象根据接收的数据包发送新数据包这样的工作都由它来进行。考虑尽可能少丢失数据包的条件,应该是进行捕获操作的线程的优先级最高,这样就可以得到更高的捕包性能。
(出处:清风网络学院)
上一篇:VoIP网络设备和结构的演进及组网要素
下一篇:NGN网络技术发展趋势分析
|