如何将主机名转换为boost地址或端点?

8

我正在使用一个基于Boost的C++ Redis库。(https://github.com/nekipelov/redisclient

要连接,我必须提供一个TCP端点:

boost::asio::ip::tcp::endpoint

或者是一个地址+端口号。
boost::asio::ip::address, unsigned short

目前,我开始的内容是:

boost::asio::ip::address address = boost::asio::ip::address::from_string(someIPVariable);

我曾经通过 IP 地址和端口连接成功。然而,现在我需要使用主机名来连接。如果我只是在上面的行中输入主机名,它会抛出一个异常,因为它期望一个 IP 地址。

我习惯于简单地指定连接为 ("IP 或 主机名", 端口),所以我不太确定这里需要什么。我检查了两者的构造函数,看是否有任何可以将主机名+端口转换为所需内容的方法,但我找不到任何东西。

2个回答

11
你需要使用tcp::resolver来进行名称解析(即DNS查找):
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("example.com", "80");
boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);

解除迭代器引用会给你一个具有tcp::endpoint的解析器条目:

boost::asio::ip::tcp::endpoint endpoint = iter->endpoint();

2
请注意,可能会有更多的匹配项,并且查找可以异步完成(如果您的IO本身是异步的,则非常重要)。 - sehe
谢谢,我会尝试一下,并且如果一切顺利就会接受。目前我们正在同步使用它。@sehe 如果有多个匹配,应该怎么办?只应该有一个(局域网环境,使用主机文件将机器名指向 IP),但永远不能太小心。 - mGuv
1
它返回一个迭代器,用于一系列一个或多个匹配项,因此如果有多个,则需要对它们进行迭代。如果“resolve”调用成功(即不抛出异常,或者不为非抛出重载设置“error_condition”),则保证至少有一个结果,但可能有多个。 - Jonathan Wakely
他们把这个问题搞得过于复杂了。我为什么需要一个端口来获取IP地址,io_service又是什么?我只有主机名和端口,想要创建一个套接字。 - CashCow
你如何“迭代”任何东西?一个方法返回一个迭代器,但你需要检查它的“结束”在哪里? - CashCow
显示剩余4条评论

2

虽然这是一个老帖子,但对于任何有兴趣的人来说...

异步版本:

boost::asio::io_service io_service;
boost::asio::io_service::strand io_strand(io_service);
boost::asio::ip::tcp::resolver resolver(io_service);

resolver.async_resolve({"host", "port"}, 
  io_strand.wrap([this](const boost::system::error_code& ec, 
                        boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
{
    if (!ec)
    {
        std::for_each(endpoint_iterator, {}, [this](auto& it)
        {
            std::cout << it.endpoint().address() << std::endl;
        });
    }
    else
    {
        //ec.message()?
    }
}));

注意(1): 由于系统可能有多个网络接口/适配器,因此我们可以从resolve函数中获得多个结果。这就是为什么我们应该遍历结果并检查“任何”符合您的需求。例如,检查endpoint.address().is_v4();

注意(2): 不要忘记运行I/O服务:io_service.run();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接