gpt4 book ai didi

c++ - ASIO 直接从异步解析中获取 tcp 端点

转载 作者:可可西里 更新时间:2023-11-01 02:50:28 26 4
gpt4 key购买 nike

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

我在 porthopper 中看到例如,无需处理迭代器即可获取端点。

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 示例中显示的内容?

最佳答案

哦,但是

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

与迭代器打交道非常多!它使用它来取消引用。注意到那个可爱的星星了吗?这是 pointer indirection运营商。

至于你的电话:

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

这不满足完成处理程序的要求。事实上,尝试使用 Boost Asio² 编译它会出现大量错误: 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(

The docs say :

enter image description here

你看,又是你的迭代器!这绝非偶然。该库的设计使得异步调用将始终返回相同的数据,而不管选择的接口(interface)如何。¹

拼凑起来: 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();
}

打印³:

handle_resolve_handler: Success 216.58.213.196:443

¹ 比照。使用协程(yieldyield[ec])、asio::use_future 等时的区别:How to set error_code to asio::yield_context

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

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

关于c++ - ASIO 直接从异步解析中获取 tcp 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47041413/

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