vs2010运行出现Debug Assertion Failed
是一个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那出错了,可是语法明明是对的啊?这是怎么回事呢?
请大家帮我解答下啊!谢谢了
[解决办法]
string1是空值NULL了吧?
[解决办法]
sprintf的声明如下:
int __cdecl sprintf (
char *string,
const char *format,
...
)
断言指出的就是参数string为空值,检查一下在调用sprintf的时候相应参数是否为空