2011-12-08 19 views
2

私はローカルアドレス/ポートの組み合わせにバインドされたブーストasioソケットを使用しようとします。それは素晴らしい作品です。何がうまくいかないのは、ソケットとアプリケーションがいったん停止して再起動すると、ソケットを再利用することです。ブーストasioでソケットを再利用

// 
    // open the socket - it would also be opened by the async_connect() 
    // method but we might need an open socket to bind it 
    _socket.open(boost::asio::ip::tcp::v4()); 

    if (_bindLocal) { 
     boost::asio::socket_base::reuse_address option(true); 
     _socket.set_option(option); 
     _socket.bind(_localEndpoint); 
    } 

    // Invoke async. connect. Immediate return, no throw. 
    _socket.async_connect(_remoteEndpoint, 
     boost::bind(&MyTransceiver::handleConnect, this, 
      boost::asio::placeholders::error)); 

私は何が欠けていますか? open()、set_option()およびbind()呼び出しの順序は正しいですか?

答えて

0

コードは正常です。 error_codeを使用して、set_option()呼び出しの結果を取得してください。

+1

エラーコードは0です。その後のasync_connect()の呼び出しでは、そのアドレスは2回使用できません。 set_option()が存在しない場合と同じです。 – PMiller

+0

私はウィンドウ上にいると言います。netstatの出力には、使用しているソケットの「待機中」と表示されます。 – PMiller

+0

あなたはtime_waitを意味しますか?正しい状態なので、reuse_addressをtureに設定する必要があります。ウィンソックAPIのsetsockopt()を使用して、SO_REUSEADDRプロパティを基になるソケットに直接設定しようとするかもしれません。 – Shawnone