c++ - boost ASIO : Why don't I get "bind: Address already in use" in Windows (but do get it in Linux)?

标签 c++ boost boost-asio

尝试绑定(bind)一个已经绑定(bind)的 TCP 端口应该引发异常(“绑定(bind):地址已在使用”异常)。

它确实发生在 Linux 下。但在 Windows 下,不会引发异常..

可能是因为在 Windows 下它试图绑定(bind)到任何接口(interface)?但在 Linux 中,它会尝试绑定(bind)所有这些对象,如果不是所有对象都绑定(bind),则会引发异常?

这是代码片段:

    try {
        tcp::endpoint endpoint(tcp::v4(), 8081);
        tcp::acceptor acceptor(io_service);
        acceptor.open(endpoint.protocol());
        acceptor.set_option(tcp::acceptor::reuse_address(true));
        acceptor.set_option(tcp::acceptor::enable_connection_aborted(true));
        acceptor.bind(endpoint);
        acceptor.listen(1024)
    catch(std::exception &e) {
         cout << e.what() << endl;
    }

最佳答案

在 Windows 中,选项 tcp::acceptor::reuse_address 等同于调用 setsockopt 并指定 SO_REUSEADDR。这特别允许多个套接字绑定(bind)到一个地址,即使它正在使用中。请参阅 MSDN 文档 here.

在 Win32 (SO_EXCLUSIVEADDRUSE) 中有一个对应的选项是 documented here .这篇文章详细介绍了在 Win32 平台上简单地使用 SO_REUSEADDR 的一些潜在缺点。

关于c++ - boost ASIO : Why don't I get "bind: Address already in use" in Windows (but do get it in Linux)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164879/

相关文章:

c++ - 与 C++ 相比, native C 中的复数(和虚数 i)如何表示?

c++ - 如何将组合的 Asio 操作与 C++20 协程一起使用以返回值?

c++ - 是否有效,使用 std::string 保存二进制数据,以避免手动动态内存管理

c++ - shared_ptr 对容器的意义是什么?

c++ - boost.python 公开返回 vector<MyClass> 的函数

c++ - 在 Debug模式下使用 boost 库的发布版本

c++ - boost::asio::read() 永远阻塞

c++ - 为什么在使用 boost::asio 时每个连接都需要 strand?

c++ - VS2010 Beta 1 上的基本 C++ 应用程序出现多个编译错误

c++ - 从 `std::vector<char>` 内部的位获取整数