[网络]url解码,从网址转化为ip

server/2025/2/11 22:29:31/

我们在学习网络时,底层代码中往往需要指定对应的ip进行通信,而网络上的资源大多是以网址的形式进行传输的,那么如何从网址变为ip呢

DNS

首先我们知道一个网址,比如说baidu.com,我们要把它变为ip,首先会检查本地缓存(如浏览器缓存或操作系统缓存)中是否已经存在该域名的IP地址。如果存在,直接使用缓存的IP地址,无需进一步查询。

如果本地缓存没有会递归的向上层查询,DNS(域名系统,Domain Name System)就是对应的上层服务器

代码

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <cstring>// 函数:解析域名并获取IP地址和端口号
std::pair<std::string, int> resolveUrl(const std::string &url)
{// 默认端口int port = 443; // HTTPS 默认端口if (url.find("http://") == 0){port = 80; // HTTP 默认端口}// 提取域名std::string domain = url;if (domain.find("http://") == 0){domain = domain.substr(7); // 去掉 "http://"}else if (domain.find("https://") == 0){domain = domain.substr(8); // 去掉 "https://"}// 检查是否有自定义端口size_t colonPos = domain.find(':');if (colonPos != std::string::npos){port = std::stoi(domain.substr(colonPos + 1));domain = domain.substr(0, colonPos);}// 使用getaddrinfo解析域名struct addrinfo hints, *res;memset(&hints, 0, sizeof(hints));hints.ai_family = AF_INET; // IPv4hints.ai_socktype = SOCK_STREAM;int status;if ((status = getaddrinfo(domain.c_str(), NULL, &hints, &res)) != 0){std::cerr << "getaddrinfo error: " << gai_strerror(status) << std::endl;return {"", -1};}// 获取IP地址char ipStr[INET_ADDRSTRLEN];inet_ntop(AF_INET, &((struct sockaddr_in *)res->ai_addr)->sin_addr, ipStr, INET_ADDRSTRLEN);freeaddrinfo(res); // 释放资源return {ipStr, port};
}
int main(int argc, char **argv)
{std::string str_url;if (argc == 2){str_url = argv[1];}else{std::cerr << "参数错误" << std::endl;exit(0);}auto[ip,port] = resolveUrl(str_url);std::cout << "Get a Url : " << str_url << std::endl;printf("Url to be ip+port   %s:%d\n",ip.c_str(),port);return 0;
}

测试

可以通过对照pin指令来判断结果是否正确


http://www.ppmy.cn/server/166870.html

相关文章

数据集成实例分享:金蝶云星空对接旺店通实现库存管理自动化

拆卸父项出库&#xff1a;金蝶云星空数据集成到旺店通企业奇门 在现代企业的运营过程中&#xff0c;数据的高效流动和准确处理至关重要。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将金蝶云星空的数据无缝对接到旺店通企业奇门&#xff0…

Jmeter常用的几种断言方法

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在使用Jmeter进行性能测试或者接口自动化测试工作中&#xff0c;经常会用到的一个功能&#xff0c;就是断言&#xff0c;断言相当于检查点&#xff0c;它是用来判…

大数据项目2:基于hadoop的电影推荐和分析系统设计和实现

前言 大数据项目源码资料说明&#xff1a; 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等&#xff0c;极大提升效率&#xff01; 1、项目目标 本…

JS逆向实战二:建筑平台js逆向Error: Malformed UTF-8 data报错处理

本文说明&#xff1a;B站学习笔记整理&#xff0c;仅供学习参考~~ 网站&#xff1a;https://jzsc.mohurd.gov.cn/data/company 1. 页面分析与解密 刷新浏览器之后&#xff0c;在【网络】-【预览】下非正常显示数据&#xff0c;在【发起请求】发现“Promise then”说明为异步…

CVPR | CNN融合注意力机制,芜湖起飞!

**标题&#xff1a;**On the Integration of Self-Attention and Convolution **论文链接&#xff1a;**https://arxiv.org/pdf/2111.14556 **代码链接&#xff1a;**https://github.com/LeapLabTHU/ACmix 创新点 1. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…

Matlab机械手碰撞检测应用

本文包含三个部分&#xff1a; Matlab碰撞检测的实现URDF文件的制作机械手STL文件添加夹爪 一.Matlab碰撞检测的实现 首先上代码 %% 检测在结构环境中机器人是否与物体之间发生碰撞情况&#xff0c;如何避免&#xff1f; % https://www.mathworks.com/help/robotics/ug/che…

数据库,数据表的增删改查操作

一.数据库的基本操作 &#xff08;1&#xff09;创建数据库 创建数据库就是在数据库系统中划分一块存储数据的空间&#xff0c;方便数据的分配、放置和管理。在MySQL中使用CREATE DATABASE命令创建数据库&#xff0c;语法格式如下: CREATE DATABASE数据库名称; 注&#xff1a…

加速度计信号处理

【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究&#xff08;Matlab代码实现&#xff09;_加速度计滤波器-CSDN博客 https://wenku.baidu.com/view/622d38b90f22590102020740be1e650e52eacff9.html?_wkts_1738906719916&bdQ…