揮発性のメモ2

http://d.hatena.ne.jp/iww/

getaddrinfoの挙動が変わった

AI_ADDRCONFIGを指定してgetaddrinfo()を呼び出したとき、ちょっと前まではIPv6,IPv4の順番でリストが返ってきてたけど、最近(Debian squeezeくらいから?)ではIPv4,IPv6の順にリストが返ってくるようになった。
今まではリストの先頭だけ使ってIPv6環境なら自動的にIPv6サーバになるようにしてたけど、これからはこの方法は使えなくなった。

    struct addrinfo hints = {
        .ai_flags       = AI_PASSIVE | AI_ADDRCONFIG,
        .ai_family      = AF_UNSPEC,
        .ai_socktype    = SOCK_STREAM,
    }
    result = getaddrinfo( NULL, "5000", &hints, &ai ); // ポート5000で待ち受けしたい
    if( result!=0 ){
        fprintf( stderr,"getaddrinfo: %s\n", gai_strerror(result) );
        return -1;
    }

    // 取得したリストを見てみる
    struct addrinfo *tmpai;
    for( tmpai=ai; tmpai!=NULL; tmpai=tmpai->ai_next ){
        switch( tmpai->ai_family ){
          case AF_INET: 
            printf("ai_family = AF_INET\n" );   
            break;
          case AF_INET6: 
            printf("ai_family = AF_INET6\n" );   
            break;
          default:
            printf("ai_family = %d\n",tmpai->ai_family );
        }
    }

    freeaddrinfo(ai);
ai_family = AF_INET
ai_family = AF_INET6