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

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

可能是因为在Windows下它试图绑定(bind)到ANY接口(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的一些潜在缺点。

10-08 11:58