第一次运行 - 绑定(bind)成功,当我重新启动程序时 - 错误 10048(地址已使用)
无需调用关闭和关闭 - 重启一切正常
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;
}
最佳答案
问题在于,套接字可能已进入TIME-WAIT
状态。参见 Error: Address already in use while binding socket with address but the port number is shown free by `netstat`
您可以设置选项以重用该地址:这应该可以防止这样的TIME-WAIT
参见this 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();
关于c++ - 提升 asio 关闭绑定(bind)套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38022945/