题目
None of the functions with this name in scope match the target type
class CPacketscapturedDlg :public CDialog
{
public:
CPacketscapturedDlg(CWnd* pParent = NULL);
void ethernet_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*
packet_header,const u_char *packet_content);
void ip_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr
*packet_header,const u_char* packet_content);
void arp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const
u_char * packet_content);
void icmp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *
packet_header,const u_char * packet_content);
void udp_protocol_packet_callback(u_char * argument,const struct pcap_pkthdr *
packet_header,const u_char * packet_content);
void tcp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const
u_char *packet_content);
void go_capture();
}
void CPacketscapturedDlg::ethernet_protocol_packet_callback(u_char *argument,const struct
pcap_pkthdr* acket_header,const u_char *packet_content){}
void CPacketscapturedDlg::ip_protocol_packet_callback(u_char *argument,const struct
pcap_pkthdr *packet_header,const u_char* packet_content){}
void CPacketscapturedDlg::arp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr
*packet_header,const u_char * packet_content){}
void CPacketscapturedDlg::icmp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr * packet_header,const u_char * packet_content){}
void CPacketscapturedDlg::udp_protocol_packet_callback(u_char * argument,const struct pcap_pkthdr * packet_header,const u_char * packet_content){}
void CPacketscapturedDlg::tcp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const u_char *packet_content){}
void CPacketscapturedDlg::go_capture()
{
pcap_t *pcap_handle;
u_char *pkt_data;
char error_content[PCAP_ERRBUF_SIZE];
char *net_interface;//网络接口
struct bpf_program bpf_filter;//过滤规则
char bpf_filter_string[]="";
bpf_u_int32 net_mask;//网络掩码
bpf_u_int32 net_ip;//网络地址
net_interface=pcap_lookupdev(error_content);//获得网络接口
pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);//获得网络地址和网络掩码
pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,0,error_content);//打开网络接口
pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
if(pcap_datalink(pcap_handle)!=DLT_EN10MB)
return;
pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);//回调函数的方式捕获数据包
pcap_close(pcap_handle);
}
void CPacketscapturedDlg::OnCapture()
{
go_capture();
}
编译出现如下的错误:'pcap_loop' :cannot convert parameter 3 from 'void (unsigned char *,const struct pcap_pkthdr *,const unsigned char *)' to 'void (__cdecl *)(unsigned char *,const struct pcap_pkthdr *,const unsigned char *)'
None of the functions with this name in scope match the target type
class CPacketscapturedDlg :public CDialog
{
public:
CPacketscapturedDlg(CWnd* pParent = NULL);
void ethernet_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr*
packet_header,const u_char *packet_content);
void ip_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr
*packet_header,const u_char* packet_content);
void arp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const
u_char * packet_content);
void icmp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *
packet_header,const u_char * packet_content);
void udp_protocol_packet_callback(u_char * argument,const struct pcap_pkthdr *
packet_header,const u_char * packet_content);
void tcp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const
u_char *packet_content);
void go_capture();
}
void CPacketscapturedDlg::ethernet_protocol_packet_callback(u_char *argument,const struct
pcap_pkthdr* acket_header,const u_char *packet_content){}
void CPacketscapturedDlg::ip_protocol_packet_callback(u_char *argument,const struct
pcap_pkthdr *packet_header,const u_char* packet_content){}
void CPacketscapturedDlg::arp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr
*packet_header,const u_char * packet_content){}
void CPacketscapturedDlg::icmp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr * packet_header,const u_char * packet_content){}
void CPacketscapturedDlg::udp_protocol_packet_callback(u_char * argument,const struct pcap_pkthdr * packet_header,const u_char * packet_content){}
void CPacketscapturedDlg::tcp_protocol_packet_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const u_char *packet_content){}
void CPacketscapturedDlg::go_capture()
{
pcap_t *pcap_handle;
u_char *pkt_data;
char error_content[PCAP_ERRBUF_SIZE];
char *net_interface;//网络接口
struct bpf_program bpf_filter;//过滤规则
char bpf_filter_string[]="";
bpf_u_int32 net_mask;//网络掩码
bpf_u_int32 net_ip;//网络地址
net_interface=pcap_lookupdev(error_content);//获得网络接口
pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);//获得网络地址和网络掩码
pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,0,error_content);//打开网络接口
pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
if(pcap_datalink(pcap_handle)!=DLT_EN10MB)
return;
pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);//回调函数的方式捕获数据包
pcap_close(pcap_handle);
}
void CPacketscapturedDlg::OnCapture()
{
go_capture();
}
编译出现如下的错误:'pcap_loop' :cannot convert parameter 3 from 'void (unsigned char *,const struct pcap_pkthdr *,const unsigned char *)' to 'void (__cdecl *)(unsigned char *,const struct pcap_pkthdr *,const unsigned char *)'
None of the functions with this name in scope match the target type
提问时间:2021-03-25
答案
普通类成员变量是无法作为 回调函数的,原因就是C++会给类增加一个隐含的参数变量this指针.
这也就是你的类成员函数 ethernet_protocol_packet_callback 出问题的原因.
解决办法:
1.不要用类成员函数来做回调函数.这个估计和你的封装到类中的初衷不符.
2.把ethernet_protocol_packet_callback 加static变成静态函数.不过静态成员函数只能访问静态成员变量,这一点你也要注意一下.如果访问了非静态成员变量,则还会编译失败.
如果一定要访问对象的其他非静态成员变量,可以给类增加一个静态的指针,类型为类本身的类型,并且在类对象的构造函数中初始化它指向类对象,这样就可以访问类对象的所有成员了.
这也就是你的类成员函数 ethernet_protocol_packet_callback 出问题的原因.
解决办法:
1.不要用类成员函数来做回调函数.这个估计和你的封装到类中的初衷不符.
2.把ethernet_protocol_packet_callback 加static变成静态函数.不过静态成员函数只能访问静态成员变量,这一点你也要注意一下.如果访问了非静态成员变量,则还会编译失败.
如果一定要访问对象的其他非静态成员变量,可以给类增加一个静态的指针,类型为类本身的类型,并且在类对象的构造函数中初始化它指向类对象,这样就可以访问类对象的所有成员了.
举一反三
已知函数f(x)=x,g(x)=alnx,a∈R.若曲线y=f(x)与曲线y=g(x)相交,且在交点处有相同的切线,求a的值和该切线方程.
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
最新试题
热门考点
- 1如图,等腰三角形ABC的底边BC=5㎝,AD是∠BAC的角平分线,E是底边BC上的点,且ED=1㎝.(1)作出点E关于AD的对
- 2中国共产党的宗旨是什么
- 3已知数量{an}的前n项和为sn,且a1=1,a(n+1)=1/3sn,n=1,2,3...(1)求a2,a3,a4的值及数列
- 4This is only a pro forma invoice.
- 5Rt△ABC中,斜边上的中线CD为√3,周长为4+2√3,求:(1)这个直角三角形的面积;(2)斜边上的高CE
- 6找规律填数1.8.27.
- 7发现/认为…… 用英语怎么表达
- 8一个长方形的长是5分之3米,宽是长的5分之3,面积是多少平方米?
- 9有关月亮的四字词语和解释
- 10求一篇介绍少年派奇幻漂流的英语小短文