winpcap pcap_breakloop问题,诚心请教各位

flyfish99 2005-11-05 01:43:38
您好,我现在用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的帮帮忙

谢谢了~


...全文
692 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangding 2005-11-07
  • 打赏
  • 举报
回复
学习
iceworld819 2005-11-05
  • 打赏
  • 举报
回复
flyfish99 2005-11-05
  • 打赏
  • 举报
回复
我看了,就是现在的搜索功能不能全文搜索~
好的,那我试一试吧main放在全局看看
不过现在去吃午饭了~
谢谢 kingzai(stevenzhu) (
kingzai 2005-11-05
  • 打赏
  • 举报
回复
好像是要写成全局函数的,可以参考我以前回答的有关winpcap的帖子

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧