c语言中打印ipv6地址,c-来自任何有效地址的ipv4和ipv6

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

简单的例子:

#include

#include

#include

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

std::set

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

unique;

for (auto it = r.resolve({ip, ""}); it != resolver::iterator {}; ++it)

{

//std::cout << "Resolved: " << it->host_name() << " -> " << it->endpoint() << " " << it->service_name() << "

";

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

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));

}

请注意,当DNS响应之一匹配时,此测试将确定端点重叠.这在群集设置中可能并不总是正确的(?那里没有专家),并且您可能还想在使用此算法之前检测广播地址(未经测试).

另请注意,我认为没有办法检测实际主机的等效性(这意味着,如果主机具有多个物理/逻辑NIC,它们将在传输级别上显示为单独的服务器).

最后,在实际应用程序中,您将需要异步进行解析(使用async_resolve)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值