vs2010运行出现Debug Assertion Failed

Lucky_Lucy 2012-11-08 04:59:46
是一个winpcap程序

void CPage1::OnBnClickedButstart()
{

// TODO: 在此添加控件通知处理程序代码
//找到被选择的网卡
for(inum=0;inum<=i;inum++)
{
if(((CListBox*)GetDlgItem(IDC_LIST1))->GetSel(inum))
{
for(d=alldevs,i=0;i<inum-1;d=d->next,i++);
}

}
//打开网卡设备
if((adhandle=pcap_open_live(d->name, //设备名称
65536,//捕获全部的数据包
1, //设置网卡为混杂模式
1000, //读超时为1秒
errbuf //错误缓存
))==NULL)
{
AfxMessageBox(_T("不能打开网卡。"));
//释放设备列表
pcap_freealldevs(alldevs);

}
//检测链接层,只支持以太网模式
if(pcap_datalink(adhandle)!=DLT_EN10MB)
{
AfxMessageBox(_T("此程序只能运行在以太网上。\n"));
pcap_freealldevs(alldevs);
}
if(d->addresses!=NULL)
{
//返回接口的第一个地址的掩码
netmask=((struct sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;
}
else
{ //如果没有掩码,则默认设置为C类
netmask=0xffffff;
}
//选择过滤包类型
CFilter filter1;
switch(filter1.m_pro_all)
{
case 0:
strcpy(packet_filter,"ip");
break;
case 1:
strcpy(packet_filter,"ip");
break;
case 2:
strcpy(packet_filter,"ip and tcp");
break;
case 3:
strcpy(packet_filter,"ip and udp");
break;
case 4:
strcpy(packet_filter,"ip and icmp");
break;
default:
break;
}
//编译过滤器
if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)
{
AfxMessageBox(_T("不能编译过滤器。请检测语法。"));
pcap_freealldevs(alldevs);
}
//设置过滤器
if(pcap_setfilter(adhandle,&fcode)<0)
{
AfxMessageBox(_T("设置过滤器出错"));
pcap_freealldevs(alldevs);
}
//不再需要任何设备列表,进行释放
pcap_freealldevs(alldevs);
//开始嗅探
pcap_loop(adhandle,0,packet_handler,NULL);

}

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
CPage1 *pthis=(CPage1*)param;//定义用于访问类成员函数的指针
ip_header *ih;
u_int ip_len;

// 返回IP首部的位置
ih = (ip_header *) (pkt_data +
14); //以太网的首部长度是14

// IP首部长度
ip_len = (ih->ver_ihl & 0xf) * 4;

//sprintf(string1,"%s ",check_protocol(ih->proto));

// 输出源地址IP和目的地址IP
sprintf(string1,"协议:%s %d.%d.%d.%d -> %d.%d.%d.%d ",
check_protocol(ih->proto),
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr.byte4
);
//CString string3(string1);
//string3.Format(_T("%s"),string1);//把char*类型转换为CString类型
string3=string1;
pthis->decode_ip((char*)(pkt_data+14+ip_len),ih->proto);//******在回调函数中使用类的成员函数
//printf("\n");
}
我感觉好像是sprintf那出错了,可是语法明明是对的啊?这是怎么回事呢?

请大家帮我解答下啊!谢谢了
...全文
528 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dataxdata 2012-11-08
  • 打赏
  • 举报
回复
sprintf的声明如下: int __cdecl sprintf ( char *string, const char *format, ... ) 断言指出的就是参数string为空值,检查一下在调用sprintf的时候相应参数是否为空
Lucky_Lucy 2012-11-08
  • 打赏
  • 举报
回复
不是,后来我改过来了,是因为void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)这个函数是全局函数,里面的GetDlgItem调用的控件需要句柄指定属于哪个对话框,我的方法是: 弄个全局变量: CWnd * g_pWnd; 在对话框中的OnInitDialog 函数中: g_pWnd = this; 然后就可以在其它类中这样用: g_pWnd->GetDlgItem(nID); 然后就可以了
dataxdata 2012-11-08
  • 打赏
  • 举报
回复
string1是空值NULL了吧?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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