救命啊!!!winpcap总能抓到重复的包,怎么回事?

smin80 2010-03-20 10:25:23
最近在写一个抓ie包的程序
贴部分代码如下:
while((!STOPFLAG)&&((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0))
{
if(header->len>0)
{
/* 找到IP头的位置 */
ih = (ip_header *) (pkt_data +
14); //14为以太头的长度

/* 找到TCP头的位置 */
ip_len = (ih->ver_ihl & 0xf) * 4;
th = (tcp_header *) ((u_char*)ih + ip_len);

//数据的真正起点
data=(u_char*)ih + ip_len+20;

if (_mbsstr(data,care)) //const u_char care[]="7b2c50";
{
nPacketNum++;
strPacketNum.Format("%d",nPacketNum);
pcap_dump((unsigned char *)dumpfile, header, pkt_data);
wndDlg.SetWindowText(strPacketNum);
}
}
}

其中STOPFLAG是结束这个线程的标志。

遇到这样一个问题,如果单独使用pcap_dump函数,不进行字符串判断,也就是所有包都接收的话,那么每个包只收一次。
可按照代码中的写法,不但绝大多数情况下会收到完全重复的包(甚至连时间戳都不变,而且重复数量不定),而且还能收到一些不满足(_mbsstr(data,care))条件的包。

达人们伸出援手啊,小弟拜谢先。
...全文
983 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq136644622 2012-11-12
  • 打赏
  • 举报
回复
重复抓包问题得以解决,但我不知道pcap_next_ex( adhandle, &header, &pkt_data)==1跟>=0的区别 返回的结果只有0 1 -1 ,-1 表示出错,0 表示超时,1表示成功,一般返回0 是表示没有接受到数据
Eleven 2010-05-17
  • 打赏
  • 举报
回复
结贴通知:
请lz注意结贴。。。。
smin80 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wizardk 的回复:]
引用 2 楼 smin80 的回复:

引用 1 楼 wizardk 的回复:
你是自发自收做的实验吧,pcap_next_ex会收到自己发送的包

没有啊,我是监听固定端口,自己没有发包。


你确定物理上不是两包?用抓包工具监测下
[/Quote]

极其肯定只有一个包,用wpe抓过,也只有一个包。
zerglordyzj 2010-03-21
  • 打赏
  • 举报
回复
呵呵。赶上这个了,学习学习:)各位都是高手啊。
smin80 2010-03-21
  • 打赏
  • 举报
回复
感谢楼上,请问您代码中的方法,跟直接判断res==1有什么不同吗?
还有,为什么我总能抓到不符合(_mbsstr(data,care))的包?是因为我处理这部分的代码效率比较低(我没看出来有多么太低),而导致winpcap做了什么操作,把内存中的数据都写入文件了吗?

再谢!
WizardK 2010-03-21
  • 打赏
  • 举报
回复
pcap_open_live中的timeout以毫秒为单位,记得我的程序里是参考DEMO给的1000。
又仔细看了下你的流程,应该这样:

while((res = pcap_next_ex(pDlg->m_fp, &header, &pkt_data)) >= 0)
{
/* Data received */
if(res)
{
...;
}
/* Timeout elapsed */
else ...;
}

smin80 2010-03-21
  • 打赏
  • 举报
回复
经修改,将代码成为:
while(!STOPFLAG)
{
if (pcap_next_ex( adhandle, &header, &pkt_data)==1)
{
if(header->len>0)
{
/* 找到IP头的位置 */
ih = (ip_header *) (pkt_data +
14); //14为以太头的长度

/* 找到TCP头的位置 */
ip_len = (ih->ver_ihl & 0xf) * 4;
//th = (tcp_header *) ((u_char*)ih + ip_len);

//数据的真正起点
data=(u_char*)ih + ip_len+20;

if (_mbsstr(data,care))
{
nPacketNum++;
strPacketNum.Format("%d",nPacketNum);
pcap_dump((unsigned char *)dumpfile, header,pkt_data);
wndDlg.SetWindowText(strPacketNum);
}
}
}

重复抓包问题得以解决,但我不知道pcap_next_ex( adhandle, &header, &pkt_data)==1跟>=0的区别。也就是pcap_open_live的timeout参数是什么意思。

虽然没有重复的包了,但是还是能接到内容不符合(_mbsstr(data,care))的包。这又是怎么回事?

大大们帮忙啊,卡了两天了!
WizardK 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 smin80 的回复:]

引用 1 楼 wizardk 的回复:
你是自发自收做的实验吧,pcap_next_ex会收到自己发送的包

没有啊,我是监听固定端口,自己没有发包。
[/Quote]

你确定物理上不是两包?用抓包工具监测下
smin80 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wizardk 的回复:]
你是自发自收做的实验吧,pcap_next_ex会收到自己发送的包
[/Quote]
没有啊,我是监听固定端口,自己没有发包。
WizardK 2010-03-20
  • 打赏
  • 举报
回复
你是自发自收做的实验吧,pcap_next_ex会收到自己发送的包

18,356

社区成员

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

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