0

私は次のコードを持っています:

if ( ( m_mainSocket = ::socket( PF_INET, SOCK_STREAM, IPPROTO_TCP ) ) < 0 )
{
    throw Exception( __FILE__, __LINE__ ) << "Unable to create socket";
}

int on( 0 );

if ( setsockopt( m_mainSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof( on ) ) )
{
    throw Exception( __FILE__, __LINE__ ) << "Can't make server socket resusable.";
}

sockaddr_in addr;
memset( &addr, 0, sizeof( addr ) );

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl( INADDR_ANY );
addr.sin_port = htons( p_localPort );

if ( ::bind( m_mainSocket, reinterpret_cast< sockaddr * >( &addr ), sizeof( addr ) ) < 0 )
{
    throw Exception( __FILE__, __LINE__ ) << "Failed to bind the server socket";
}

close()を使用してサーバーを閉じると、同じポートでサーバーを再度開くことができなくなります。なんで?ポートを変更するか、システムを再起動する必要があります。これはUbuntuとMacOSXでのみ発生します。Windowsでは、この問題は発生しません。

:: bind()関数でエラーが発生しました。ソケットを2回再バインド()することはできません。

再バインドするにはどうすればよいですか?

4

1 に答える 1

4

REUSEADDRに0ではなく1を渡す必要があります。

socket(7)マニュアルページから:

   ソケットオプション
       これらのソケットオプションは、setsockopt(2)を使用して設定し、
       すべてのソケットでソケットレベルがSOL_SOCKETに設定されたgetsockopt(2):

      ...。

       SO_REUSEADDR
              提供されたアドレスの検証に使用されるルールを示します
              bind(2)呼び出しでは、ローカルアドレスの再利用を許可する必要があります。にとって
              AF_INETソケットこれは、次の場合を除いて、ソケットがバインドされる可能性があることを意味します
              アドレスにバインドされたアクティブなリスニングソケットがあります。いつ
              リスニングソケットは、特定のポートでINADDR_ANYにバインドされています
              その場合、ローカルのこのポートにバインドすることはできません
              住所。引数は整数のブールフラグです。
于 2010-02-02T19:18:44.423 に答える