c++ - 提升 asio 关闭绑定(bind)套接字

标签 c++ boost-asio

第一次运行 - 绑定(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/

相关文章:

c++ - M_PI 适用于 math.h 但不适用于 Visual Studio 中的 cmath

c++如何从函数中的 vector 中删除对象

c++ - 在哪里声明结构等?

c++ - 未解析的外部符号?

c++ - 链接多个使用 boost 的项目时出现 LNK2005 错误

c++ - async_read_some 模拟同步超时接收

c++ - 何时调用 SSL_set_verify 与 SSL_CTX_set_verify

c++ - boost asio http 客户端 - io_service.run()

c++ - UML 中的首选组合或聚合是什么?

c++ - Boost asio udp套接字发送到不同的IP地址