winpcap pcap_breakloop问题,诚心请教各位
您好,我现在用wpcap3.1在vc里面做开发~
我现在能够成功得抓取包信息并进行分析了
可是做法是把有关wpcap的函数及其处理函数都写成全局函数
现在我想把处理包的函数也当成类的成员函数来处理
所以我把他们都加入到了类里面
可是现在的问题出现了,好像我的pcap_loop过程终止不了了~
以前都用pcap_breakloop终止的,现在pcap_breakloop(adhandle)似乎不工作了都~
----------------
我的代码的工作流程是:抓包按钮按下后启动一个线程执行pcap_loop语句,并检测是否有break_loop请求;结束按钮通过发送一个event信号通知接触pcap_loop操作,接触抓包过程
----------------
全局函数时正确的代码为:
void CMyGetPacketDlg::OnDump()
{
..............
hthread = CreateThread(NULL,NULL,main_thread,NULL,0,&threadID);
.............
}
线程处理函数为(全局函数):
DWORD WINAPI main_thread(LPVOID lpParameter)
{
int code;
.........
code = pcap_loop(adhandle,0,packet_dispatch,(unsigned char*)dumper);
if (code == -1)
MessageBox(NULL,"pcap_loop调用出错","信息",MB_OK);
if (code == -2)
MessageBox(NULL,"pcap_loop正常中断","信息",MB_OK);
.........
return 0;
}
------------------
packet_dispatch处理函数(也是全局函数)为:
void packet_dispatch(unsigned char* dumper, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
...........
/*hEvent为一通知Loop过程退出的事件,时间由结束抓包按钮发出*/
if (WaitForSingleObject(hEvent,0) != WAIT_TIMEOUT)
{
/*退出loop过程*/
pcap_breakloop(adhandle);
return ;
}
//--------------------
/*下面的代码是处理各种类型包的子线程,关键部分是上面的代码*/
ipph = (ip_header*)(pkt_data+14);
switch (ipph->ip_p){
case ICMP:
//handle_icmp(dumper, header,pkt_data);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)handle_icmp,(LPVOID)tp,0,NULL);
break;
.........
return;
}
----------------------------------
最后,退出抓包按钮的代码是:
void CMyGetPacketDlg::Onstopcap()
{
SetEvent(hEvent);//设置终止抓包事件
WaitForSingleObject(hthread,INFINITE);
CloseHandle(hthread);
CloseHandle(mutex_icmp);
CloseHandle(mutex_udp);
CloseHandle(mutex_tcp);
pcap_close(adhandle);
}
----------------------------------------------------------
上面的代码可以实现我的要求,可是由于太多处理函数都是公共函数,所以我想把他们纳入我的主类里面
所以我把上面设计的所以回调函数定义成类的静态成员函数,可是问题出来了,就是
当我按下stop按钮以后
WaitForSingleObject(hthread,INFINITE);
一直处于等待状态,而且main_thread函数一直在执行loop操作,因为没有出现对话框提示loop过程结束
我通过调试发现
if (WaitForSingleObject(hEvent,0) != WAIT_TIMEOUT)
{
/*退出loop过程*/
pcap_breakloop(adhandle);
return ;
}
上面的pcap_breakloop(adhandle);语句已经被执行了的;既然执行了,为什么loop函数还不结束呢?
我就是把全局函数改变成了类成员函数以及其他不想关的地方,比如messagebox changed to afxmessagebox ,请教搞过wpcap的帮帮忙
谢谢了~