2016-06-24 113 views
1

在第一次運行 - 綁定成功,當我重新啓動程序 - 錯誤10048(地址已經使用)升壓ASIO緊密綁定套接字

沒有調用close和關機 - 重新啓動,一切都很好

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()調用發生錯誤。 「傳輸端點未連接。」關閉()的調用不會產生任何錯誤。所以,也許你的問題發生在連接呼叫。不過,我期望這會導致你的關機調用版本產生一個異常,所以也許不會。 –

回答

1

的問題在於,套接字可能已進入TIME-WAIT狀態。見Error: Address already in use while binding socket with address but the port number is shown free by `netstat`

您可以設置重複使用地址的選項:應該避免這種TIME-WAITthis explanation和更全面的版本here

在Boost.Asio的,你可以這樣說:

//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); 

編輯

通過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();