ASIO 直接从异步解析获取 tcp 端点

2023-12-07

我正在寻找使用 ASIO 独立库(不是 Boost ASIO),我正在尝试设置客户端以连接到特定端口上的服务器。

我看到在波特漏斗例如,无需处理迭代器即可获取端点。

asio::io_service io_service;

// Determine the location of the server.
tcp::resolver resolver(io_service);
tcp::resolver::query query(host_name, port);
tcp::endpoint remote_endpoint = *resolver.resolve(query);

我正在尝试使用解析器 async_resolve() 成员函数来解析查询。

这是我目前拥有的代码:

asio::io_service IOService;
asio::ip::tcp::resolver resolver(IOService);
asio::ip::tcp::resolver::query query(ADDRESS, PORT);
resolver.async_resolve(query,
            [this](const tcp::endpoint srvEndpoint, std::error_code error)
            {
                IOService->post(
                    [this, error, srvEndpoint]
                    {
                         handle_resolve_handler(error, srvEndpoint);
                    });
            });

有没有一种方法可以完成 porthopper 示例中所示的操作,但异步执行?


Oh, but

tcp::endpoint remote_endpoint = *resolver.resolve(query);

与迭代器打交道非常多!它使用它来取消引用。注意到那个可爱的星星了吗?这是指针间接操作员。

至于你的电话:

resolver.async_resolve(query,
            [this](const tcp::endpoint srvEndpoint, std::error_code error)
            {
                IOService->post(
                    [this, error, srvEndpoint]
                    {
                         handle_resolve_handler(error, srvEndpoint);
                    });
            });

That does not satisfy the completion handler requirements. Indeed, trying to compile it with Boost Asio² gives a slew of errors: Live On Coliru:

main.cpp:12:14:   required from here
/usr/local/include/boost/asio/ip/basic_resolver.hpp:163:5: error: static assertion failed: ResolveHandler type requirements not met
     BOOST_ASIO_RESOLVE_HANDLER_CHECK(
     ^
/usr/local/include/boost/asio/ip/basic_resolver.hpp:163:5: error: no match for call to '(Demo::doResolve()::<lambda(boost::asio::ip::tcp::endpoint, boost::system::error_code)>) (const boost::system::error_code&, const boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>&)'
     BOOST_ASIO_RESOLVE_HANDLER_CHECK(

文档说:

enter image description here

你瞧,你的迭代器又出现了!这绝非偶然。该库的设计是这样的,无论选择什么接口,异步调用都将始终返回相同的数据。

Cobbling it together: Live On Coliru

#include <boost/asio.hpp>
#include <iostream>

namespace asio = boost::asio;
using boost::system::error_code;
using asio::ip::tcp;

struct Demo {
    Demo(asio::io_service& svc) : _svc(svc) {}
    void doResolve() {
        resolver.async_resolve(query, [this](error_code error, tcp::resolver::iterator it) {
                tcp::endpoint ep = error? tcp::endpoint{} : *it;
                _svc.post([this, error, ep] { handle_resolve_handler(error, ep); });
            });
    }

  private:
    asio::io_service& _svc;
    tcp::resolver resolver     {_svc};
    tcp::resolver::query query {"www.google.com", "https"};

    void handle_resolve_handler(error_code ec, tcp::endpoint srvEndpoint) {
        std::cout << "handle_resolve_handler: " << ec.message() << " " << srvEndpoint << "\n";
    }
};

int main() {
    asio::io_service svc;
    Demo x(svc);
    x.doResolve();

    svc.run();
}

Prints³:

handle_resolve_handler: Success 216.58.213.196:443

1 参见使用协程时的区别(yield or yield[ec]), asio::use_future etc.: 如何将 error_code 设置为 asio::yield_context

² 基本上s/boost::system::error_code/std::error_code/

³ 在具有网络访问权限的系统上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASIO 直接从异步解析获取 tcp 端点 的相关文章

  • Boost 错误代码参考

    有谁知道在哪里可以找到升压错误代码的参考 特别是 异步套接字处理程序返回的错误代码 Google 和 grep 头文件已调为空 我从 Linux 上的 asio error hpp 中提取了错误值 顺便说一句 我仅使用标头 asio 而不是
  • 插入多重集中:在该值第一次出现之前而不是最后一次出现之后

    正如标题所示 multiset 在所有相同值的范围末尾插入一个值 例如 在多重集中插入 21 2 2 3做到了1 2 2 new 2 3 如何在所有相同值的范围开头插入新值 例如 在多重集中插入 21 2 2 3应该使1 new 2 2 2
  • VS2015 代码覆盖率不适用于 ASP.NET Core 1.0(以前称为 ASP.NET 5)中的测试

    我有一个 ASP NET Core 1 0 以前称为 ASP NET 5 解决方案 其中包含几个类库 包 和一个 ASP NET MVC6 项目 我有一个使用支持 Core 1 0 的新 XUnit 2 0 的测试库 然而 由于某种原因 当
  • 为什么纯虚拟析构函数的实现必须为空?它应该是内联的吗?

    我在其他线程中读到 当您实现纯虚拟析构函数 是的 它可以有一个实现 时 它必须是空的 并且应该 是内联的 应该是空的吗 如果是这样 为什么 应该内联吗 如果是这样 为什么 编辑 这就是纯虚拟析构函数的实现方式 class A virtual
  • 寻求有关 cs50“现金”问题集的 C 贪婪算法的帮助[已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 目标是创建一种算法 该算法接受输入并给出从输入中减去值 25 10 5 1 的次数的输出 代码需要以尽可能贪婪的方式执行此操作 尽可能获取最
  • 在 C# 中格式化 Resharper 属性的支持字段

    有没有办法控制 Resharper 放置其支持字段的位置 目前 它试图让他们在班级中名列前茅 我希望他们能去到酒店的正上方 还没有
  • C++ 构造函数根据参数类型调用另一个构造函数

    我有这门课 class XXX public XXX struct yyy XXX std string private struct xxx data 第一个构造函数 使用结构 很容易实现 第二 我可以将一个字符串以特定的格式分开 解析
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • 如何更改控制台中的光标位置?

    我想用Console ReadLine 在上一行中并使其显示如下 HeresomeText gt input Not like HeresomeText gt input 可以做吗 使用 Write 方法而不是 WriteLine 方法 C
  • ofstream::operator<<(streambuf) 是一种复制文件的缓慢方法

    我需要一种跨平台 无需外部库的复制文件的方式 在我的第一遍中 我想出了 省略错误处理 char buffer LEN ifstream src srcFile ios in ios binary ofstream dest destFile
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • COM Interop 挂起会冻结整个 COM 系统。如何取消COM调用

    我正在使用通过 COM Interop 包装器公开的第三方 dll 然而 其中一个 COM 调用经常冻结 至少不会返回 为了至少让我的代码更加健壮 我异步包装了调用 getDeviceInfoWaiter is a ManualResetE
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 如何在迭代时从地图中删除?

    迭代时如何从地图中删除 喜欢 std map
  • 实现多个接口的 Service Fabric Actor 接口

    我正在构建一个应用程序 其中有多个不同的参与者类型 这些参与者类型对于某些不同的数据对象具有相同类型的行为 CRUD 为了更轻松地创建处理此问题的代码 我尝试创建一个这些参与者可以实现的接口 这意味着我有一个看起来像这样的参与者界面 pub
  • 对数据绑定组合框进行排序的最佳方法是什么?

    我对此做了一些研究 似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序 在本例中为数据集中的数据表 如果是这种情况 那么问题就变成对数据表进行排序的最佳方法是什么 组合框绑定在设计器中设置初始化使用 myCombo DataSou
  • SQlite 查询 - 如何检索多列数据?

    我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite DB 获取多个值的工作示例 这是我的sql查询 char sql query 100 sprintf sql query SELECT FROM SQList
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • 找出用户属于哪些组

    我有一个刚刚创建的 Windows 用户帐户 以 XYZ 为例 此 XYZ 属于我在计算机管理 gt 本地用户和组中创建的用户组和自定义组 因此 在属性中我看到该用户属于 2 个组 现在我想获取这些组并显示它们 有什么建议么 我已经这样做了
  • 如何用纯色填充位图?

    我需要使用唯一的 RGB 颜色创建 24 位位图 分辨率 100x100 像素 并将生成的图像保存到磁盘 我目前使用的是SetPixel http msdn microsoft com en us library 6c7eyzyb aspx

随机推荐

  • Java 扫描器未扫描整个文件

    我正在用 Java 编写一个程序 我需要做的一件事是为最短路径问题创建一组每个有效位置 这些位置在 txt 文件中定义 该文件遵循严格的模式 每行一个条目 没有额外的空格 非常适合使用 nextLine 获取数据 我的问题是 文件中的 24
  • Facebook SDK 3.1 PresentShareDialogModally 失败

    我正在尝试在 iOS 6 上测试 Facebook 的新内置共享 表 但是当我运行示例代码时 它没有显示该表 相反 它会为我发布一个状态 但不会显示它将首先发布的内容 我还以为 Facebook 不再允许你把话放到用户的嘴里了 控制台打印此
  • html 空间显示为 %2520 而不是 %20

    将文件名传递给 Firefox 浏览器会导致其将空格替换为 2520代替 20 我在名为的文件中有以下 HTMLmyhtml html img src 当我加载时myhtml html在 Firefox 中 图像显示为损坏的图像 所以我右键
  • 如何提高 g.drawImage() 方法调整图像大小的性能

    我有一个应用程序 用户可以在相册中上传图片 但上传的图像自然需要调整大小 以便还有拇指可用 并且显示的图片也适合页面 例如800x600 我调整大小的方式是这样的 Image scaledImage img getScaledInstanc
  • 如何在 python 中同时检测多个按键?

    我想对角移动我的机器人汽车 因此为了实现这一点 我想检测 w 是否与 d 或 a 一起按下 如果我想使用 w a s d 作为我的键 我现在有的是这样的 from curtsies import Input with Input keyna
  • 不同签名功能的容器

    我正在尝试用 C 编写一个框架 用户可以在其程序中指示他想要应用的一组函数记忆化战略 假设我们的程序中有 5 个函数f1 f5我们希望避免对函数进行 昂贵的 重新计算f1 and f3如果我们已经使用相同的输入调用它们 请注意 每个函数可以
  • 如何动态加载 gwt 生成的 nocache.js 文件?

    我想加载生成的 GWTfoo foo nocache js使用 JQuery 动态文件 不知何故这个foo foo nocache js文件不被浏览器执行 如果我通常使用 GWT 样式而不使用 JQuery 放置脚本 那么在加载页面后 它会
  • 标准布尔运算顺序

    我正在用 JavaScript 编写一个用于布尔逻辑的调车场算法 但我遇到了操作顺序的问题 我允许的操作是 and or implies equals biconditional not xor nor nand 但是 我不知道这些的优先顺
  • BasicNetwork.performRequest - 意外响应代码 400 (POST)

    当我尝试使用 Volley StringRequest 或 JsonObjectRequest 通过 REST API 获取数据时 我总是收到 400 错误 它与邮递员一起工作正常 Http请求方法为POST Content Type为ap
  • 在 GZIPInputStream 中包装 BodySubscriber 会导致挂起

    我正在使用新的java net http类来处理异步 HTTP 请求 响应交换 我正在尝试找到一种方法让 BodySubscriber 处理不同的编码类型 例如 gzip 然而 映射一个BodySubsriber
  • 在 C 中对齐 printf() 变量和小数

    今天C的大问题 所以我希望我的变量在列中对齐并且同时保留两位小数 我知道要达到小数点后两位 我需要使用 2f 如果我想要宽度 我使用 30s 但我无法将它们结合起来 看看我下面的代码你就会明白了 printf ItemA 2f 3 34 2
  • 宽松的内存顺序效果是否可以延长到执行线程的生命周期之后?

    假设在 C 11 程序中 我们有一个名为A启动一个名为的异步线程B 内螺纹B 我们对原子变量执行原子存储std memory order relaxed记忆顺序 然后穿线A用线程连接B 然后穿线A启动另一个名为C执行原子加载操作std me
  • 让调用堆栈向上增长会使缓冲区溢出更安全吗?

    每个线程都有自己的堆栈来存储局部变量 但堆栈也用于存储返回地址调用函数时 在 x86 汇编中 esp指向最近分配的堆栈末尾 如今 大多数 CPU 的堆栈都出现负增长 此行为可以通过溢出缓冲区并覆盖保存的返回地址来执行任意代码 如果堆栈正向增
  • 如何设置ImageView透明

    我的图像设置为 50 透明 当我把它放到ImageView上时 它完全不透明 看不到后面的东西 如何在xml中为ImageView设置100 透明 以便当我设置图像时 我可以看到后面的东西 我试过 android opacity trans
  • 表格行上的框阴影未出现在某些浏览器上

    表格行上的 CSS 框阴影 tr 跨浏览器的工作似乎不一致 在某些浏览器上会显示阴影 在其他人身上 没有影子 我正在使用以下 CSS tr background color rgb 165 182 229 box shadow 0px 2p
  • 如何取消设置 JavaScript 变量?

    我在 JavaScript 中有一个全局变量 实际上是一个window属性 但我认为这并不重要 它已经由以前的脚本填充 但我不希望稍后运行另一个脚本来查看它的值 或者甚至定义它 我已经把some var undefined它用于测试目的ty
  • Excel VBA 对于带有数据验证列表的每个循环

    我有 4 个数据验证下拉列表 我想使用 for every 循环来迭代 4 个数据验证下拉列表的所有可能值 并将结果复制到工作表中 下拉菜单位于单元格 H3 和 H4 以及 U3 和 U4 中 H3 和 U3 包含相同的值 H4 和 U4
  • 字符编码 - RequestDispatcher

    我有一个 servlet 我使用 String error error request setAttribute loginError error request setCharacterEncoding UTF 8 request get
  • 如何导出 Spearman 相关性

    我正在尝试将 Spearman 相关矩阵导出到rtf或 Excel 文件使用estpost和社区贡献的命令esttab 但是 我收到以下错误 invalid subcommand r 198 下面是我的代码 estpost spearman
  • ASIO 直接从异步解析获取 tcp 端点

    我正在寻找使用 ASIO 独立库 不是 Boost ASIO 我正在尝试设置客户端以连接到特定端口上的服务器 我看到在波特漏斗例如 无需处理迭代器即可获取端点 asio io service io service Determine the