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

news2025/1/17 3:16:32

在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.coloradmin.cn/o/998030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第19章_瑞萨MCU零基础入门系列教程之RTC

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

【基于递归混合尺度:无监督GAN:Pansharpening】

Pansharpening Using Unsupervised Generative Adversarial Networks With Recursive Mixed-Scale Feature Fusion &#xff08;基于递归混合尺度特征融合的无监督生成对抗网络泛锐化&#xff09; 全色锐化(pansharpening)是提高多光谱图像空间分辨率的重要技术。大多数模型都…

记录DatagramSocket的使用 | UDP协议下的数据传输 | java学习笔记

a端 import java.io.*; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;/*** a端发送“今天星期几”给b端*/ public class UDPa {public static void main(String[] args) throws IOException {//a端绑定9999端口————a端从…

编辑器的缩略图实现原理

一、背景 部分 Web 版的 IDE 编辑器未曾实现缩略图功能&#xff0c;探寻一下缩略图的实现逻辑。以 VSCode 为例。 VSCode 的编辑器是monaco实现的&#xff0c;编辑器的编辑区都是采用的虚拟渲染&#xff0c;即仅渲染可视区的代码&#xff0c;可视区之外的动态去除 DOM 节点。…

Windows上安装和配置Apache Kafka

Apache Kafka是一个开源的流式平台&#xff0c;用于处理实时数据流。它可以用于各种用途&#xff0c;包括日志聚合、事件处理、监控等。本文将向您展示如何在Windows操作系统上安装和配置Apache Kafka。 步骤1&#xff1a;下载和解压Kafka 首先&#xff0c;让我们从Apache Ka…

adworld-web2

web2 GFSJ0627积分 2金币 2 91最佳Writeup由 Robert_Wei 提供 收藏 反馈 难度&#xff1a;2 方向&#xff1a;Web 题解数&#xff1a;108 解出人数&#xff1a;10185 题目来源: CTF 题目描述: 解密 题目场景: http://61.147.171.105:56591 100% 倒计时: 3时59分…

基于SIFT图像特征识别的匹配方法比较与实现

基于SIFT图像特征识别的匹配方法比较与实现 1 匹配器选择 目前常用的匹配器有 BFMatcher and FlannBasedMatcher 1.1 BFMatcher BFMatcher 全称是 Brute-Force Matcher&#xff08;直译即为暴力匹配器&#xff09; 大致原理&#xff1a; 对于 img1 中的每个描述符&#x…

LVS DR模式负载均衡群集部署

目录 1 LVS-DR 模式的特点 1.1 数据包流向分析 1.2 DR 模式的特点 2 DR模式 LVS负载均衡群集部署 2.1 配置负载调度器 2.1.1 配置虚拟 IP 地址 2.1.2 调整 proc 响应参数 2.1.3 配置负载分配策略 2.2 部署共享存储 2.3 配置节点服务器 2.3.1 配置虚拟 IP 地址 2.3.2…

初学unity开发学习笔记----第一天

以下是学习unity知识的心得&#xff0c;类似备忘录&#xff0c;肯定是存在有漏洞的地方或者专业名词使用不恰当的地方。。。 目标&#xff1a;编写小球wasd移动的效果 1.下载unity hub和unity引擎: (1).前往官网:Unity实时内容开发平台 -实时3D引擎、2D、VR&AR可视化数据…

【新版】系统架构设计师 - 软件架构设计<SOA与微服务>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 架构 - 软件架构设计&#xff1c;SOA与微服务&#xff1e; 考点摘要 面向服务SOA&#xff08;★★★★&#xff09;微服务&#xff08;★★★★&#xff09; 基于/面向服务的&#xff08;SOA&#xff09; 在SO…

【新版】系统架构设计师 - 软件架构设计<新版>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件架构设计&#xff1c;新版&#xff1e;考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD&#xff08;ABSDM模型&#xff09;的开发过程 软件架…

C++ 多线程(future篇)

引言 在前面介绍了启动线程&#xff0c;以及多线程下如何保证共享资源的竞争访问、线程同步这些。但是thread类无法访问从线程直接返回的值&#xff0c;如果要想获取线程的的执行结果&#xff0c;一般都是依靠全局或static变量&#xff0c;或是以实参传递的变量&#xff0c;然后…

C# 辗转相除法求最大公约数

辗转相除法求最大公约数 public static void CalcGCD(int largeNumber, int smallNumber, out int GCD){GCD 1;int remain -1;while (remain ! 0){remain largeNumber % smallNumber;GCD smallNumber;largeNumber smallNumber;smallNumber remain;}}

华为云云耀云服务器L实例评测|华为云耀云L搭建zerotier服务测试

0. 环境 - Win10 - 云耀云L服务器 1. 安装docker 检查yum源&#xff0c;本EulerOS的源在这里&#xff1a; cd /etc/yum.repos.d 更新源 yum makecache 安装 yum install -y docker-engine 运行测试 docker run hello-world 2. 运行docker镜像 默认配…

计算机专业毕业设计项目推荐03-Wiki系统设计与实现(JavaSpring+Vue+Mysql)

Wiki系统设计与实现&#xff08;JavaSpringVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设…

大秒杀系统设计

参考链接&#xff1a;http://www.taodudu.cc/news/show-5770725.html?actiononClick 1. 一些数据 大家还记得2013年的小米秒杀吗&#xff1f;三款小米手机各11万台开卖&#xff0c;走的都是大秒系统&#xff0c;3分钟后成为双十一第一家也是最快破亿的旗舰店。 经过日志统计…

[超硬核] 5000字带走读DuckDB优化器之常量折叠与比较简化

DuckDB优化器之常量折叠与比较简化 本篇文章适合学习C的小伙伴&#xff0c;适合阅读开源项目的小伙伴&#xff0c;更适合学习数据库的小伙伴&#xff0c;欢迎与我一起探索优化器知识。 目录 DuckDB优化器之常量折叠与比较简化1.优化器规则2.表达式重写 2.1 重写/访问算子2.2 应…

makefile之目标文件生成

目标文件:源码经过编译还没有链接那些中间文件.linux .o文件 gcc $(CFLAGS) -c xxx.c -o xx.o include Makefile.config SRC : $(wildcard *.c wildcard ./audio_module/*.c) SRC_OBJ $(patsubst %.c,%.o,$(SRC))all:$(SRC_OBJ) $(info contents $(SRC))$(info objfiles $(SR…

Tomcat部署与调优

一、Tomcat概述&#xff1a; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;具有处理HTML页面的功能&#xff0c;然而由于其处理静态HTML的能力远不及Apac…

81 # 多语言

多语言实现方案 1、一个完整多个路径来实现多语言 2、前端来实现多语言&#xff08;先配置好两种语言&#xff0c;动态切换内容&#xff09;&#xff0c;比如 i18n&#xff0c;vue-i18n 3、服务端的 header 来实现切换多语言 accept-language: zh-CN,zh;q0.9 const fs req…