2

プログラムに IPv6 サポートを追加したかったのですが、奇妙なエラーが発生しました。接続を受け入れるソケットを開きたい。これが私のシナリオです:

まず、 getaddrinfo() を使用してソケット構成を見つけます。

struct addrinfo hint, *info = NULL;

memset((void *)&hint, 0, sizeof(hint));
hint.ai_family = AF_INET6;
hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV;
hint.ai_socktype = SOCK_STREAM;

if ((error = getaddrinfo(NULL, "1234", &hint, &info))) {
    /* some error handling */
}

I gen non-NULL 結果はinfo. 次に、ソケットを作成します。

socket(info->ai_family, info->ai_socktype, info->ai_protocol)

ここで私は得る-1

strerror(errno)

戻り値Address family not supported by protocol

getaddrinfo()バインドできるアドレスのみを返すと思いましたが、この場合は NULL を返すと予想されます。私は何が欠けていますか?

私のeth0には現在IPv6アドレスがないことを付け加えておきます。uClibc 0.9.32 を使用しています

4

2 に答える 2

1

AI_ADDRCONFIGカーネルでサポートされていないアドレス ファミリが返されないように、ai_flagsに追加する必要があります。最近はほとんど常にそのフラグを追加しています。

IPv6 なしでカーネルをサポートしたい場合は、ai_family を AF_INET6 に設定しないようにする必要があります。代わりに、返されたすべてのアドレスをリッスンし、AF_INET6 アドレスに IPV6_V6ONLY を設定する必要があります。残念ながら、AF_INET6 アドレスが最初に返されるという保証はありません。

于 2012-03-08T15:26:21.363 に答える
0

getaddrinfoメンバーstruct addrinfoを使用してトラバースできる、オブジェクトのリンクされたリストを返します。接続が確立されるまで (またはリストの /end に到達するまで)、返された各オブジェクトを順番にai_next試す必要があります。addrinfoNULL

于 2012-03-08T14:57:38.223 に答える