gpt4 book ai didi

boost-asio - 我应该使用什么类型的 asio 解析器对象?

转载 作者:行者123 更新时间:2023-12-04 18:29:40 33 4
gpt4 key购买 nike

对于我正在从事的副业项目应该使用哪种类型的解析器,我有点困惑。我在 asio 文档中找不到答案。

我知道 DNS 可以与 UDP 或 TCP 一起使用,并且通常通过 TCP 发送较大的响应。

asio 提供 ip::tcp::resolver 和 ip::udp::resolver。

  • 我可以互换使用它们吗?
  • 将名称解析为端点后,我计划连接
    TCP 套接字。这是否意味着我必须使用 ip::tcp::resolver?

  • 如果实际上可以互换:
  • 使用 UDP 解析器有性能优势吗?
  • 使用 TCP 解析器还有其他好处吗?
  • 如果我使用 UDP 解析器,我是否需要处理响应太大而无法进行 UDP 查找并使用 TCP 重试? (我希望连接到将解析为每个主机多个 IP 地址的 CDN)
  • 最佳答案

    使用与套接字具有相同协议(protocol)的解析器。例如, tcp::socket::connect() 预计 tcp::endpoint ,以及通过 udp::resolver::iterator 提供的端点类型是 udp::endpoint .尝试直接使用来自不同协议(protocol)的查询结果将导致编译错误:

    boost::asio::io_service io_service;  
    boost::asio::ip::tcp::socket socket(io_service);
    boost::asio::ip::udp::resolver::iterator iterator = ...;
    socket.connect(iterator->endpoint());
    // ~~~^~~~~~~ no matching function call to `tcp::socket::connect(udp::endpoint)`
    // no known conversion from `udp::endpoint` to `tcp::endpoint`

    两者都没有 tcp::resolver 也不是 udp::resolver 指定名称解析将使用的传输层协议(protocol)。 DNS 客户端将在必要时或已明确配置为使用 TCP 时使用 TCP。

    在支持服务名称解析的系统上,当使用描述性服务名称执行服务名称解析时,解析器的类型会影响结果。例如,在 IANA Service Name and Transport Protocol Port Number Registry :
  • daytime服务在 UDP 和 TCP 上使用端口 13
  • shell服务仅在 TCP
  • 上使用端口 514
  • syslog服务仅在 UDP
  • 上使用端口 514

    因此,可以使用 tcp::resolver解析 daytimeshell服务,但不是 syslog .另一方面, udp::resolver可以解决 daytimesyslog ,但不是 shell .以下示例演示了这种区别:

    #include <boost/asio.hpp>

    int main()
    {
    boost::asio::io_service io_service;

    using tcp = boost::asio::ip::tcp;
    using udp = boost::asio::ip::udp;

    boost::system::error_code error;
    tcp::resolver tcp_resolver(io_service);
    udp::resolver udp_resolver(io_service);

    // daytime is 13/tcp and 13/udp
    tcp_resolver.resolve(tcp::resolver::query("daytime"), error);
    assert(!error);
    udp_resolver.resolve(udp::resolver::query("daytime"), error);
    assert(!error);

    // shell is 514/tcp
    tcp_resolver.resolve(tcp::resolver::query("shell"), error);
    assert(!error);
    udp_resolver.resolve(udp::resolver::query("shell"), error);
    assert(error);

    // syslog is 514/udp
    tcp_resolver.resolve(tcp::resolver::query("syslog"), error);
    assert(error);
    udp_resolver.resolve(udp::resolver::query("syslog"), error);
    assert(!error);

    tcp_resolver.resolve(tcp::resolver::query("514"), error);
    assert(!error);
    udp_resolver.resolve(udp::resolver::query("514"), error);
    assert(!error);
    }

    关于boost-asio - 我应该使用什么类型的 asio 解析器对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40751034/

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