尝试绑定(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/