WinpCap的问题:pcap_loop()函数没有返回!

ISABCJJ 2008-05-12 10:55:47
if(InitAdapter())
{
int nIndex = m_ctrlComboType.GetCurSel();
_beginthreadex(NULL,0,&CaptureFunc,(LPVOID)nIndex,0,&m_thread_id);//启动线程
}
else
{
AfxMessageBox("Init Adapter Error!");
}

//初始化网络适配器
bool CWinpCapDemoDlg::InitAdapter()
{
char errBuf[PCAP_ERRBUF_SIZE];
int i;
//寻找网络适配器
if(pcap_findalldevs(&allDevs,errBuf) == -1)
{
AfxMessageBox("Error in pcap_findalldevs");
return false;
}

for(Dev = allDevs,i=0;i<0;Dev = Dev->next,i++);
//打开选取的网络适配器
if((adHandle = pcap_open_live(Dev->name,65535,1,20,errBuf)) == NULL)
{
AfxMessageBox("Unable to open the adapter!");
pcap_freealldevs(allDevs);
return false;
}
//判断网络是否为10MB以太网
if(pcap_datalink(adHandle) != DLT_EN10MB)
{
AfxMessageBox("This program works only on Ethernet network!");
pcap_freealldevs(allDevs);
return false;
}
return true;

}

unsigned int WINAPI CWinpCapDemoDlg::CaptureFunc(LPVOID param)
{
int count = 0;
int* nIndex = (int *)param;
CString strIndex;
strIndex.Format("%d",nIndex);
int nType = atoi(strIndex);
//AfxMessageBox(strIndex);
while(count <= 5)
{
//捕获数据报
pcap_loop(adHandle,1,ETH_Dispatcher_Handler,NULL);//参数3必须为一个回调函数
}
return 1;
}

void ETH_Dispatcher_Handler(u_char *, const pcap_pkthdr* header, const u_char *p)
{
PETHHEADER eth = (PETHHEADER)p;
CWinpCapDemoDlg dlg = new CWinpCapDemoDlg;

CString strShost,strDhost,strType;
strShost.Format("%02X",eth->ether_shost);
strDhost.Format("%02X",eth->ether_dhost);
strType.Format("%02X",htons(eth->ether_type));
}
...全文
461 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kitty10812 2009-10-10
  • 打赏
  • 举报
回复
额,虽然比较晚,但我还是谈谈我的看法吧。
最近在学习pcap,今天同样也遇到这个问题,后来查了pcap的manpage,发现pcap_loop()是阻塞工作方式的,当没有包捕获时,程序就阻塞在这一行了,和阻塞式的socket类似。
hisloadyan 2008-05-31
  • 打赏
  • 举报
回复
请问,现在问题解决了么。怎么解决的。我也碰到这样的问题了。一执行到pcap_loop就完全卡死。望指点阿。
hisloadyan 2008-05-31
  • 打赏
  • 举报
回复
请问,现在问题解决了么。怎么解决的。我也碰到这样的问题了。一执行到pcap_loop就完全卡死。望指点阿。
vocanicy 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ISABCJJ 的回复:]
如何检查我是否拦截到数据?因为发现程序运行到这就没有反应!
[/Quote]

如果需要检查捕捉的报文可以在回调函数ETH_Dispatcher_Handler中处理
ISABCJJ 2008-05-12
  • 打赏
  • 举报
回复
如果方便我把代码发给你,你帮我看看![Quote=引用 1 楼 stoneyrh 的回复:]
pcap_loop是一直循环的,就象消息循环一样
[/Quote]
ISABCJJ 2008-05-12
  • 打赏
  • 举报
回复
如何检查我是否拦截到数据?因为发现程序运行到这就没有反应!
stoneyrh 2008-05-12
  • 打赏
  • 举报
回复
pcap_loop是一直循环的,就象消息循环一样
vocanicy 2008-05-12
  • 打赏
  • 举报
回复
你运行程序的时候,有没有网络数据传输?

你可以打开IE访问一个网站看看是否能捕捉到报文
ISABCJJ 2008-05-12
  • 打赏
  • 举报
回复
现在问题关键是无法进入回调函数阿,就说没有捕捉到数据阿!我使用它自带的示例程序运行也不可以
![Quote=引用 4 楼 vocanicy 的回复:]
引用 2 楼 ISABCJJ 的回复:
如何检查我是否拦截到数据?因为发现程序运行到这就没有反应!


如果需要检查捕捉的报文可以在回调函数ETH_Dispatcher_Handler中处理
[/Quote]

18,356

社区成员

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

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