gpt4 book ai didi

c++ - 解析查询与使用 IP 和端口创建端点之间的区别(在 boost asio 中)

转载 作者:可可西里 更新时间:2023-11-01 02:30:24 25 4
gpt4 key购买 nike

我最近注意到我的应用程序存在问题,我认为这是因为我没有正确使用 boost::asio 并且不了解 tcp 解析器的作用。

基本上,我使用 boost::asio::ip::tcp::resolver 来获取要连接的端点。

我最近发现它可以提供多个端点(特别是当我连接到本地主机时)。

目前我在所有端点上请求 async_connect。我不是 100% 肯定,但我认为那很糟糕。我应该一个一个地向他们请求一个 async_connect,等待回复,当且仅当它失败时才尝试下一个。

所以基本上知道如果我想在这些端点上使用 async_connect 我有两个选择:

  1. 重构我的代码,以便我的 async_connect 正确处理失败,并在失败时尝试连接到其他可用端点。那时我必须传递端点迭代器。

  2. 放弃解析器并使用我自己构建的端点:boost::asio::ip::tcp::endpoint("localhost", 20015)

我觉得我应该使用第一个解决方案,而且解析器带来的不仅仅是自建端点。

但是解析器带来了什么,自建端点又是如何自解析的呢?

最佳答案

虽然 Sam 简洁地回答了大多数应用程序如何处理端点创建,但我想扩展 resolver .

解析器 用于将地址的人类可读文本表示形式转换为包含地址的结构化二进制格式的端点(通过hostname resolution)或定义的表示之间的转换。例如,解析器可以将人类可读的“localhost”解析为0x7F000001或转换“127.0.0.1” 进入 0x7F000001。 Boost.Asio 使用或模拟 getaddrinfo()执行此决议。对于异步解析,将创建一个内部线程来执行操作。

另一方面,basic_endpoint不会自行解决。虽然它不能用字符串和端口构造,但可以用 ip::address 构造。和港口。 ip::address 可以由点分十进制形式 (IPv4) 或十六进制表示法 (IPv6) 的字符串构造:

namespace ip = boost::asio::ip;
ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 20015);

ip::address::from_string() 提供主机名会抛出异常:

namespace ip = boost::asio::ip;
ip::address::from_string("localhost"); // throws boost::system::system_error

最后,使用:

  • resolver 当你想支持主机名解析或 IP 转换时。当 IP 可能发生变化但主机名保持不变,或者当单个主机名可能解析为多个 IP 时,这尤其方便。
  • ip::address::from_string() 从 IP 创建地址。

关于c++ - 解析查询与使用 IP 和端口创建端点之间的区别(在 boost asio 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17442179/

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