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

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

我们在学习网络时,底层代码中往往需要指定对应的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; // IPv4
    hints.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.kler.cn/a/541163.html

相关文章:

  • 防火墙术语大全( Firewalld Glossary of Terms)
  • 【python】matplotlib(animation)
  • Day82:创建图形界面(GUI)
  • 第1章 特征工程
  • 利用UNIAPP实现短视频上下滑动播放功能
  • win32汇编环境,结构体的使用示例一
  • 线程池里面的execute 和 submit 方法有什么区别?
  • Docker 部署 MongoDB | 国内阿里镜像
  • 汽车与AI深度融合:CES Asia 2025前瞻
  • 问卷数据分析|SPSS实操之信度效度检验
  • 老游戏回顾:TR9
  • Spring Boot 项目中使用腾讯云对象存储(COS)
  • 20爬虫:使用playwright与图鉴破解豆瓣滑动验证码
  • 软考高级《系统架构设计师》知识点(一)
  • Vue 响应式渲染 - Vue3 Class和style
  • Flink 内存模型各部分大小计算公式
  • 金砖国家技能大赛云计算赛项(容器云部分题解)
  • uniapp使用路由名称跳转
  • 分享升级spotbugs-maven-plugin 4.8.6.0遇到的坑(内附稳定运行的jdk和maven版本)
  • excel高级求和SUMIFS函数,类似数据库group by操作
  • Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明
  • 【Linux开发工具】包管理器yum和文本编辑器vim
  • NO.11十六届蓝桥杯备战|if-else语句|嵌套if|悬空else|练习4道(C++)
  • AWS在游戏开发与全球发行中的技术实践与架构解析
  • lxml 教程:Python 中高效处理 XML 和 HTML 的利器
  • 牛客周赛Round 80——举手赢棋 python 补题 + 题解