struct in6_addr在gcc c99上崩溃了

时间:2012-04-16 16:15:11

标签: ipv6 c99

我有一段代码,它获取本地IPv6地址。 gcc和clang与std = c99在这些行上崩溃:

ipv6addr.s6_addr16[i] = htons((unsigned short int)tmp);

if (!(IN6_IS_ADDR_LOOPBACK(ipv6addr.s6_addr32)
        || IN6_IS_ADDR_UNSPECIFIED(ipv6addr.s6_addr32)
        || IN6_IS_ADDR_LINKLOCAL(ipv6addr.s6_addr32))){

ipv6.c:43:13: error: no member named 's6_addr16' in 'struct in6_addr'
                    ipv6addr.s6_addr16[i] = htons((unsigned short int)tmp);
                    ~~~~~~~~ ^
ipv6.c:45:39: error: no member named 's6_addr32' in 'struct in6_addr'
            if (!(IN6_IS_ADDR_LOOPBACK(ipv6addr.s6_addr32)
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~

使用标准选项进行编译会获得成功。这是为什么? 完整来源位于http://pastebin.com/hQ3VBSKe

2 个答案:

答案 0 :(得分:2)

从2007年至2009年的相关帖子判断,似乎是一个OSX工件,

+#if defined(__APPLE__) || defined(__darwin__)
+/* OSX seems not to define these. */
+#ifndef s6_addr16
+#define s6_addr16 __u6_addr.__u6_addr16
+#endif
+#ifndef s6_addr32
+#define s6_addr32 __u6_addr.__u6_addr32
+#endif
+#endif

http://archives.seul.org/or/cvs/Jul-2007/msg00167.html

另外,

  

RFC 2553,UNP和SUS,in6_addr {}只需要s6_addr

http://seclists.org/nmap-dev/2009/q1/493

答案 1 :(得分:0)

请参阅in6_addr中的struct声明。您需要编译为gnu99才能获得扩展。

BTW错误!=崩溃