2016-06-24 10 views
1

- 私は、プログラムを再起動すると、成功したバインド - エラー10048(アドレスがすでに使用)ブーストASIO近いバインドソケット

近いとシャットダウン呼び出さずには - すべてが正常

boost::asio::io_service _ioService; 
boost::asio::ip::tcp::socket _socket(_ioService); 


boost::system::error_code err; 
_socket.open(boost::asio::ip::tcp::v4(), err); 
if (err.value()) 
{ 
    cout<<err.value()<<endl; 
    cout << err.message() << endl; 
} 

_socket.bind(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 1276), err); 
cout << err.value() << endl; 

if (err.value()) 
{ 
    cout << err.value() << endl; 
    cout << err.message() << endl; 
} 

_socket.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 1500), err); 
if (err.value()) 
{ 
    cout << err.value() << endl; 
    cout << err.message() << endl; 
} 

_socket.shutdown(_socket.shutdown_both); 
_socket.close(err); 

if (err.value()) 
{ 
    cout << err.value() << endl; 
    cout << err.message() << endl; 
} 
+0

このコードを実行しようとしましたが、呼び出しごとにエラー報告を追加しました。私の最初のエラーはconnect()呼び出しで発生します。 "接続拒否"。これにより、shutdown()呼び出しでエラーが発生します。 "転送エンドポイントが接続されていません。" close()の呼び出しでエラーは発生しませんでした。だから、あなたの問題は、接続の呼び出しで発生する可能性があります。それでも、あなたのバージョンのシャットダウンコールで例外が発生することが予想されます。 –

答えて

1

で再起動します問題は、ソケットがTIME-WAIT状態に入っている可能性があります。 this explanationと、より包括的なバージョンhereを参照してくださいTIME-WAITなどを防ぐ必要があります:あなたはアドレスを再利用するためのオプションを設定することができますError: Address already in use while binding socket with address but the port number is shown free by `netstat`

を参照してください。

//Add this 

boost::asio::socket_base::reuse_address reuse_address_option(true); 
m_socket.set_option(reuse_address_option); 

m_socket.bind(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 1250), err); 

EDITソースドキュメントの例があるsource code of acceptorを掘り後

// @par Example 
// Opening a socket acceptor with the SO_REUSEADDR option enabled: 
// @code 
boost::asio::ip::tcp::acceptor acceptor(io_service); 
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port); 
acceptor.open(endpoint.protocol()); 
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); 
acceptor.bind(endpoint); 
acceptor.listen(); 
ここに再現:

Boost.ASIOで

、あなたは、このようにそれを行うことができます

関連する問題