1

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

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获得

4

2 回答 2

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

于 2012-04-16T16:54:05.577 回答
0

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

顺便说一句错误!=崩溃

于 2012-04-16T16:56:17.740 回答