2

古い構造getaddrinfoを直接埋めるのではなく、パッシブソケット/リスナーで関数を使用しようとしています。sockaddr私の目的は、ソケットを開いてポートにバインドすることです。基本的に私はサーバーを構築しています。

理由はわかりませんが、getaddrinfo2 つの結果が返されます。このため、2回目にバインドを呼び出すと、「アドレスは既に使用されています」というエラーで終了します。これを修正する方法と、それをループにするのが正しいかどうかを知っていますか?

         struct addrinfo addr;
         memset(&addr,0,sizeof(addrinfo));
         addr.ai_family   = AF_INET;
         addr.ai_socktype = SOCK_STREAM;
         addr.ai_protocol = 0;
         addr.ai_flags    = AI_PASSIVE;

         struct addrinfo * rp,* result;
         getaddrinfo( "localhost","59001",&addr,&result );
         for( rp = result; rp != NULL; rp = rp->ai_next ){

              int sd = socket( AF_INET, SOCK_STREAM, 0 );
              if(-1==sd ){ 
              printf( "error creating the socket %m");
              return -1; 
              }             

             if( -1==bind( sd, result->ai_addr, result->ai_addrlen ) ){                 
             printf( "error binding %m")
             return -1;
             }

             if( -1== listen(sd, MAX_BACKLOG ) ){
             std::cerr << "listen didn't work" << std::endl;
             return -1;
             }       
         }
4

2 に答える 2

4

ここでいくつかのことが起こっています。からの複数の結果についてgetaddrinfo()は、IPv4 アドレスと IPv6 アドレスが返されるためです (両方あります)。「使用中のアドレス」については、SO_REUSEADDRオプションを設定する必要があります。と の呼び出しの間にこれを挿入しsocket()ますbind()

int opval = 1;
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
于 2013-01-21T14:54:32.647 に答える
0

これは、redhat マシン上にある可能性がありますか? これらにはよく知られたバグがあります。/etc/hosts/リストがlocalhost2 回表示されるため、具体的に要求するAF_INETと、実際には同じ結果が 2 回得られます。1 回は IPv4 用、もう 1 回は IPv6 用です。

https://bugzilla.redhat.com/show_bug.cgi?id=496300も参照してください。

于 2013-01-24T01:27:49.093 に答える