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 に答える