Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自任何有效地址的ipv4和ipv6_C++_Linux_Boost_Boost Asio_Ip Address - Fatal编程技术网

C++ 来自任何有效地址的ipv4和ipv6

C++ 来自任何有效地址的ipv4和ipv6,c++,linux,boost,boost-asio,ip-address,C++,Linux,Boost,Boost Asio,Ip Address,我试图从任何字符串地址获取ipv4和ipv6地址,无论是通过ipv4、ipv6还是DNS地址 我可以创建自己的函数来实现这一点,但我正在尝试利用内置功能 有没有办法输入任何格式的地址字符串,并同时返回和boost地址?boost::ip::address提供了这种类型的功能 您可以使用from_string函数从任意格式的字符串(对于ipv4为十进制或对于ipv6为十六进制)构造地址: boost::ip::address address( boost::ip::address::from_st

我试图从任何字符串地址获取ipv4和ipv6地址,无论是通过ipv4、ipv6还是DNS地址

我可以创建自己的函数来实现这一点,但我正在尝试利用内置功能


有没有办法输入任何格式的地址
字符串
,并同时返回和boost地址?

boost::ip::address提供了这种类型的功能

您可以使用from_string函数从任意格式的字符串(对于ipv4为十进制或对于ipv6为十六进制)构造地址:

boost::ip::address address( boost::ip::address::from_string( myIpAddress ) );
然后您应该能够返回v4或v6 ip地址:

boost::asio::ip::address_v4 ipv4 = address.to_v4();
boost::asio::ip::address_v6 ipv6 = address.to_v6();

从DNS名称获取地址涉及。。。正在查询命名服务器(DNS!)。如果要枚举结果,请在asio中使用解析器:

简单的例子:

#include <boost/asio.hpp>
#include <boost/function_output_iterator.hpp>
#include <set>

using boost::asio::ip::address;

std::set<address> unique_endpoints(std::string const& ip)
{
    using resolver = boost::asio::ip::tcp::resolver;
    boost::asio::io_service ios; // TODO use existing service / resolver
    resolver r(ios);

    std::set<address> unique;
    for (auto it = r.resolve({ip, ""}); it != resolver::iterator {}; ++it)
    {
        //std::cout << "Resolved: " << it->host_name() << " -> " << it->endpoint() << " " << it->service_name() << "\n";
        address a = it->endpoint().address();
        if (a.is_v4())
            unique.insert(boost::asio::ip::address_v6::v4_mapped(a.to_v4()));
        else
            unique.insert(a);
    }

    return unique;
}

template <typename S>
bool endpoints_overlap(S const& a, S const& b)
{
    bool matching_found = false;

    std::set_intersection(
            a.begin(), a.end(), b.begin(), b.end(),
            boost::make_function_output_iterator([&](address const&) { matching_found = true; }));

    return matching_found;
}

int main()
{
    auto h = unique_endpoints("bbs2.fritz.box");
    auto a = unique_endpoints("192.168.2.111");
    auto b = unique_endpoints("::ffff:192.168.2.111");
    auto c = unique_endpoints("::ffff:c0a8:026f");

    assert(endpoints_overlap(a, b));
    assert(endpoints_overlap(a, c));
    assert(endpoints_overlap(b, c));

    assert(endpoints_overlap(h, a));
    assert(endpoints_overlap(h, b));
    assert(endpoints_overlap(h, c));
}
#包括
#包括
#包括
使用boost::asio::ip::address;
std::设置唯一的_端点(std::字符串常量和ip)
{
使用resolver=boost::asio::ip::tcp::resolver;
boost::asio::io_服务ios;//TODO使用现有服务/解析器
分解器(ios);
std::设置唯一性;
for(auto it=r.resolve({ip,“});it!=resolver::iterator{};++it)
{

//std::cout-hmm..我想这取决于您的操作系统。如果您在linux上,我会尝试在中使用gethostbyname函数。对Windows不太确定这不会执行“DNS地址”@Gracchus:如果没有
解析器
,您将如何解析DNS名称?