gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:50 37 4
gpt4 key购买 nike

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

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com