您的位置:首页 > 其它

struct ip_mreq 未定义问题解决

2020-04-15 16:11 911 查看

场景

        编译Onvif发现模块,出现如下组播的地址结构体没有定义的问题

onvif_server.c:54:20: 错误:‘mcast’的存储大小未知
     struct ip_mreq mcast;
                    ^
make: *** [onvif_server.o] 错误 1

解决
  在onvif_server.c文件头文件下面添加如下定义
struct ip_mreq
{
        struct in_addr imr_multiaddr;//主机即将加入监听的组播地址
        struct in_addr imr_interface;//指定客户端主机加入组播使用哪张网卡的IP地址
};

问题1)引入头文件#include <netinet/in.h>,无效
问题2)Makefile文件指定宏定义-D __USE_GNU, 无效

  
知识点
1)__BEGIN_DECLS 和__END_DECLS
sys/cdefs.h
#if defined(__cplusplus)  
 #define __BEGIN_DECLS   extern "C" {  
 #define __END_DECLS     }
#else  
 #define __BEGIN_DECLS 
 #define __END_DECLS

说明编写代码,经常需要c和c++混合使用,为了使 C 代码和 C++ 代码保持互相兼容的过程调用接口,
需要在 C++ 代码里加上 extern “C” 作为符号声明的一部分,为了简化,从而定义了上面的两个宏方面我们使用

2)内核源码查找结构体或者宏定义
[root@localhost onvif-server-discover]# find / -name "*.h" | xargs grep "struct ip_mreq" -rn
/usr/include/linux/in.h:166:struct ip_mreq  {
/usr/include/linux/in.h:171:struct ip_mreqn {
/usr/include/linux/in.h:177:struct ip_mreq_source {
/usr/include/netinet/in.h:265:struct ip_mreq
/usr/include/netinet/in.h:274:struct ip_mreq_source
/usr/include/bits/in.h:152:/* Like `struct ip_mreq' but including interface specification by index.  */
/usr/include/bits/in.h:153:struct ip_mreqn
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:62: struct ip_mreqn  multi;
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:113:extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:114:extern int ip_mc_join_group_ssm(struct sock *sk, struct ip_mreqn *imr,
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:116:extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:119:  struct ip_mreq_source *mreqs, int ifindex);
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/uapi/linux/in.h:166:struct ip_mreq  {
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/uapi/linux/in.h:171:struct ip_mreqn {
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/uapi/linux/in.h:177:struct ip_mreq_source {

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: