【问题标题】:incompatible types when assigning to type 'struct in_addr' from type 'int'从“int”类型分配给“struct in_addr”类型时不兼容的类型
【发布时间】:2015-03-01 23:37:10
【问题描述】:

我在linux(ubuntu 12.04 linux kernel 3.12.17)中编写了以下代码,它比较成功,但是当我用eclipse移动android中的代码并与ndk比较时,它显示错误:分配时类型不兼容从“int”类型中键入“struct in_addr”。

addrs = inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);

整个代码是:

#include <jni.h>
#include <linux/if.h>
#include <linux/in.h>
#include <linux/sockios.h>
#include <stdint.h>
#include <sys/endian.h>
static struct in_addr *getbroadcastaddr(char *inter, int sock, char *buf){
    struct ifconf ifc;
    struct ifreq ifreq,*ifr;
    static struct in_addr addrs;
    struct sockaddr_in *sin;
    bzero(&addrs,sizeof(addrs));
    ifc.ifc_len = UDPMSGSIZE;
    ifc.ifc_buf = buf;
    if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
        perror("broadcast: ioctl (get interface configuration)");
        return(&addrs);
    }
    ifr = ifc.ifc_req;
    for (ifr=ifc.ifc_req;ifr->ifr_name[0];ifr++) {
        if (strcmp(ifr->ifr_name,inter)) continue;
        ifreq = *ifr;
        if (ioctl(sock, SIOCGIFFLAGS, (char *)&ifreq) < 0) {
            perror("broadcast: ioctl (get interface flags)");
            continue;
        }
        if ((ifreq.ifr_flags & IFF_BROADCAST) &&
               (ifreq.ifr_flags & IFF_UP) &&
               (ifr->ifr_addr.sa_family == AF_INET)) {
            sin = (struct sockaddr_in *)&ifr->ifr_addr;
            if (ioctl(sock, SIOCGIFBRDADDR, (char *)&ifreq) < 0) {
                addrs = inet_makeaddr(inet_netof(sin->sin_addr), INADDR_ANY);
            } else {
                addrs = ((struct sockaddr_in *)
                        (&ifreq.ifr_broadaddr))->sin_addr;
            }
            printf("Interface : %s\n",ifr->ifr_name);
            return(&addrs);
        }
    }
    return(NULL);
}

为什么? android-ndk中的'inet_makeaddr'函数在枪中是否有所不同?

【问题讨论】:

    标签: android c linux networking android-ndk


    【解决方案1】:

    错误消息具有误导性,该功能只是在早期版本的 NDK 中缺失。编译器会产生不兼容的类型错误,因为当函数未定义时,它假定返回类型为int

    相关文件为(NDK文件夹)/platforms/android-xx/arch-yyy/usr/include/arpa/inet.h

    您可以通过更新到the latest version of the NDK 来解决您的问题。 inet_makeaddrinet.h 中定义为 android-21

    如果之后仍然出现编译错误,请尝试

    #include <arpa/inet.h>
    

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2016-01-23
      • 2016-02-24
      相关资源
      最近更新 更多