尝试绑定(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
的一些潜在缺点。