我看已有的实例上是允许获取TCP,UDP,ARP协议的数据包,但我不知道他的这个过滤
的规则具体写在哪里。我本人要做的是除了以上协议也允许获取OSPF协议的数据包,
求大神指教,我需要改哪里。具体代码如下:
struct bpf_program fcode;
bpf_u_int32 NetMask;
NetMask=0xffffff;
pcap_t *pCap;
char strErrorBuf[1025];
//OnButtonFiltersave();
char filter[1024];
strcpy(filter, m_strFilterString.GetBuffer(m_strFilterString.GetLength()));
m_strFilterString.ReleaseBuffer();
if( getDevice() != NULL )
{
if((pCap=pcap_open_live(getDevice()->name,65536,1,1000,strErrorBuf))==NULL)
{
return ;
}
if(pcap_compile(pCap, &fcode, filter, 1, NetMask) < 0)
{
//fprintf(stderr,"\nError compiling filter: wrong syntax.\n");
AfxMessageBox("编译字符串失败,请确认你的规则编写的正确性,或查看帮助文档中规则的编写规范");
return ;
}
AfxMessageBox("规则:"+m_strFilterString+"\n测试通过!!!!");
pcap_close(pCap);
}
else
AfxMessageBox("当前没有选持要测试的网卡");
WinPcap过滤规则
下面对WinPcap的过滤表达式语法进行一下简要的介绍,其中关键字用黑体字表示。
1) 表达式支持逻辑操作符,可以使用关键字 and、or、not对子表达式进行组合,同时支持使用小括号。
2) 基于协议的过滤要使用协议限定符,协议限定符可以为ip、arp、rarp、tcp、udp等。
3) 基于MAC地址的过滤要使用限定符ether(代表以太网地址)、当该MAC地址仅作为源地址时表达式为ether src mac_addr,仅作为目的地址时,表达式为ether dst mac_addr,既作为源地址又作为目的地址时的表达式为ether host mac_addr。此外应注意mac_addr应该遵从00:E0:4C:E0:38:88的格式,否则编译过滤器时会出错。
4) 基于IP地址的过滤应该使用限定符host(代表主机地址)。当该IP地址仅作为源地址时过滤表达式应为 src host ip_addr,仅作为目的地址时的表达式为 dst host ip_addr,既作为源地址又作为目的地址时表达式为 host ip_addr。
5) 基于端口的过滤应使用限定符 port。例如仅接收80端口的数据包则表达式为port 80。
下边给出两个例子:
例1:只捕获arp或icmp数据包。
过滤表达式:arp or (ip and icmp)
例2:捕获主机192.168.1.23与192.168.1.28之间传递的所有UDP数据包。
过滤表达式:(ip and udp)and( host 192.168.1.23 or host 192.168.1.28)
pcap_compile把字符串转换为bpf_program格式的二进制编码。
也就是说,修改m_strFilterString的内容,增加一个 "or (ospf_filter)"。
由于ospf是l3的89协议(请自己确认),所以ospf_filter使用“ip proto 89”