当前位置: 首页 > news >正文

在Linux系统上用C++将主机名称转换为IPv4、IPv6地址

在Linux系统上用C++将主机名称转换为IPv4、IPv6地址

功能

指定一个std::string类型的主机名称,函数解析主机名称为IP地址,含IPv4和IPv6,解析结果以std::vector<std::string>类型返回。解析出错或者解析失败抛出std::string类型的异常消息。

源代码 

以前随便写的一个解析域名为IP地址的功能现在需要支持IPv6,所以做了些调整。最后结果如下:

/*C++,将域名解析为IP地址(含IPv4和IPv6)
编译: g++ -o main main.cpp
执行:./main
效果:$ ./main 
13.226.120.15
13.226.120.23
13.226.120.56
13.226.120.3
2600:9000:21e1:1200:1c:b3b0:7700:93a1
2600:9000:21e1:bc00:1c:b3b0:7700:93a1
2600:9000:21e1:9a00:1c:b3b0:7700:93a1
2600:9000:21e1:4e00:1c:b3b0:7700:93a1
2600:9000:21e1:a200:1c:b3b0:7700:93a1
2600:9000:21e1:3600:1c:b3b0:7700:93a1
2600:9000:21e1:1a00:1c:b3b0:7700:93a1
2600:9000:21e1:1800:1c:b3b0:7700:93a1*/// getaddrinfo, gai_strerror, freeaddrinfo
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>// inet_ntop
#include <arpa/inet.h>// strerror
#include <cstring>#include <string>
#include <vector>
#include <iostream>// 域名解析为IP地址,返回地址列表。
std::vector<std::string> hostToIPs(const std::string& host) {std::vector<std::string> addressList;addrinfo hints;hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_STREAM;hints.ai_protocol = 0;hints.ai_flags = 0;hints.ai_canonname = nullptr;hints.ai_addr = nullptr;hints.ai_next = nullptr;addrinfo* result = nullptr;auto res = getaddrinfo(host.c_str(), nullptr, &hints, &result);if (0 != res) {throw std::string(gai_strerror(res));}if (nullptr != result) {int bufferSize = 64;char buffer[64];void* pointer;for (auto rp = result; rp != nullptr; rp = rp->ai_next) {switch (rp->ai_family) {case AF_INET:pointer = (void*)&(((sockaddr_in*)(rp->ai_addr))->sin_addr);break;case AF_INET6:pointer = (void*)&(((sockaddr_in6*)(rp->ai_addr))->sin6_addr);break;default:continue;}if (nullptr == inet_ntop(rp->ai_family, pointer, buffer, bufferSize)) {freeaddrinfo(result);throw std::string("Run inet_ntop fail, errno is ") + std::to_string(errno)+ ", message: " + std::string(strerror(errno));}addressList.emplace_back(std::string(buffer));}freeaddrinfo(result);}if (addressList.size() <= 0) {throw std::string("address list is empty");}return addressList;
}int main() {try {for (const auto& address : hostToIPs("www.english.com")) {std::cout << address << std::endl;}} catch (const std::string& e) {std::cout << e << std::endl;}return 0;
}

运行截图

程序在Ubuntu上开发调试,结果是OK的。解析结果支持IPv4和IPv6地址,主要参考材料是man手册。运行截图:

http://www.lryc.cn/news/162701.html

相关文章:

  • 【硬件设计】硬件学习笔记二--电源电路设计
  • day34 集合总结
  • 【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计
  • 区块链技术与应用 - 学习笔记3【比特币数据结构】
  • Ubuntu下高效Vim的搭建(离线版)
  • 阿里云和腾讯云2核2G服务器价格和性能对比
  • PYTHON(一)——认识python、基础知识
  • Python 操作 Excel
  • 21.添加websocket模块
  • Linux UDP编程流程
  • 【opencv】多版本安装
  • webpack打包常用配置项
  • 回归预测 | MATLAB实现MPA-BiGRU海洋捕食者算法优化双向门控循环单元多输入单输出回归预测(多指标,多图)
  • selenium_webdriver自动化测试指南
  • 红米Note12Turbo解锁BL刷入PixelExperience原生ROM系统详细教程
  • NoSQL之Redis配置与优化(一)
  • Boost搜索引擎
  • 侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)
  • LeetCode——贪心篇(二)
  • Linux find
  • UE4实现断线重连功能
  • nginx笔记
  • 动态库的制作和使用
  • AWS Glue Pyspark+Athena基础学习汇总
  • 智能合约安全新范式,超越 `require`和`assert`
  • 【ESP-S3-BOX-Lite花屏问题】:Github下载源码(出厂源码factory_demo)编译调试到ESP-S3-BOX-Lite中出现花屏现象
  • Redis集群3.2.11离线安装详细版本(使用Ruby)
  • Ansible自动化运维
  • MSTP + Eth-Trunk配置实验 华为实验手册
  • 滚动菜单 flutter