【问题标题】:boost::asio failed to connect to localhost without WLANboost::asio 在没有 WLAN 的情况下无法连接到 localhost
【发布时间】:2014-04-14 20:59:48
【问题描述】:

在我的电脑(Surface Pro 2)上,只有一个网卡, 它是一个无线 LAN 适配器。

我从事过一个小型 C++ 项目,它使用 boost::asio 连接到 localhost 并做它的工作,一切都很好。

但今天我发现如果我断开 WLAN 与 Internet 的连接, 这个程序不起作用。

boost::asio的解析器会抛出异常:

tcp::resolver::query query("localhost", "10127");
tcp::resolver resolver(io_service_);
tcp::resolver::iterator iterator;

try {
    iterator = resolver.resolve(query);
}
catch (boost::system::system_error& e) {
    log(e.what());
}

错误信息是:请求的名称有效但没有数据 找到了请求的类型。

Ping 到 localhost 没问题。

我很疑惑,本地网络程序需要互联网吗? 本地网络程序是否需要 LAN 适配器? 为什么 ping 可以正常工作?

【问题讨论】:

    标签: c++ boost network-programming boost-asio wifi


    【解决方案1】:

    我无法解释您为什么会出现此错误。但是,我在项目中所做的并不是直接指定端口号,而是分两步构建端点实例。我不记得当时这样做的理由,但它可能会对你有所帮助。

    我提出的解决方案是这样的:

    ip::tcp::resolver::query query(ip::tcp::v4(), "localhost", ""); // empty service name
    tcp::resolver::iterator it_endpoint = resolver.resolve(query);
    ip::tcp::endpoint endpoint(ip::tcp::endpoint(*it_endpoint).address(), port);
    

    这是我所做工作的摘要摘录,因此可能无法按原样编译。

    【讨论】:

      【解决方案2】:

      本地网络不需要互联网即可工作。在您的情况下,当 Windows TCP/IP 层没有任何 DNS 服务器配置(未连接网卡,..etc)时,我不知道解决 localhost 的确切问题。但是您可以使用tcp::resolver::query query("127.0.0.1", "10127"); 而不是tcp::resolver::query query("localhost", "10127"); 这总是有效的。

      【讨论】:

        【解决方案3】:

        我刚刚在 linux 机器上遇到了同样的问题,并查看了 boost asio 文档。您只需向query 构造函数添加一个标志参数: tcp::resolver::query query("localhost","10127",tcp::resolver::query::canonical_name);

        注意:query 的全称是boost::asio::ip::tcp::resolver::query

        发生这种情况是因为此处传递的默认标志参数是boost::asio::ip::tcp::resolver::query::address_configured,这意味着如果为系统配置了非环回 IPv4/IPv6 地址,则调用应该只解析 IPv4/IPv6 地址。

        【讨论】:

        • 这是我见过的最好的答案。只需断开 LAN 电缆即可解决 Linux 上的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 2015-05-24
        • 2021-12-23
        相关资源
        最近更新 更多