BOOST ASIO:为什么我在Windows中没有“绑定:已经在使用的地址”(但是在Linux中得到它)?

时间:2011-08-23 17:11:14

标签: c++ boost boost-asio

尝试绑定已绑定的TCP端口应引发异常(“bind:Address in in use”异常)。

它确实发生在Linux下。但在Windows下,没有异常被提出..

可能是因为在windows下它试图绑定到任何接口吗?但是在Linux中它会尝试绑定到所有这些并且如果不是所有这些都被绑定会引发异常吗?

以下是代码段:

    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;
    }

1 个答案:

答案 0 :(得分:2)

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

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