• 如何将字符数串和IP地址进行转换?


    这一部分主要是网络编程中会使用,将数串和IP地址进行转换,在进行转换之前,我们需要知道IP地址在linux系统中的结构体定义

    地址类型结构体

    具体如下表:

    结构体功能特性
    struct sockaddr套接字地址结构IPv4/IPv6通用
    struct sockaddr_inIPv4套接字地址结构IPv4专用
    struct in_addrIPv4地址结构IPv4专用
    in_addr_tIPv4地址类型IPv4专用
    truct sockaddr_in6IPv6套接字地址结构IPv6专用

    这些地址中具体包含的变量有:

    • 套接字地址结构
    struct sockaddr {
        unsigned short sa_family; // 套接字地址簇类型,为AF_INET
        char sa_data[14];         // 套接字地址数据(14位的协议地址)
    };
    
    • 1
    • 2
    • 3
    • 4
    • IPv4套接字地址结构
    struct sockaddr_in{
        short sin_family;         // 套接字地址簇类型,为AF_INET
        unsigned short sin_port;  // 端口号,网络字节序
        struct in_addr sin_addr;  // IP地址,网络字节序
        unsigned char sin_zero[8];// 填充字节
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • IPv4地址结构
    struct in_addr {
        in_addr_t s_addr;
    };
    
    • 1
    • 2
    • 3
    • IPv4地址类型
    typedef unsigned int in_addr_t;
    
    • 1
    • IPv6套接字地址结构
    struct sockaddr_in6{
       uint8_t sin6_len;           //IPv6 为固定的24 字节长度
       sa_family_t sin6_family;    //套接字地址簇类型,为AF_INET6
       in_port_t sin6_port;        //16 位端口号,网络字节序
       uint32_t sin6_flowinfo;     //32 位流标签
       struct in6_addr sin6_addr;  //128 位IP地址
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    转换函数

    函数功能特点
    int inet_aton(const char string, struct in_addraddr)点分十进制数串转网络字节序长整型IPv4专用
    in_addr_t inet_addr(const char* string)点分十进制数串转网络字节序长整型IPv4专用
    char* inet_ntoa(struct in_addr addr)网络字节序长整型转点分十进制数串IPv4专用
    int inet_pton(int af, const char *src, void *dst)点分十进制数串转网络字节序长整型IPv4/IPv6通用(推荐)
    const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)网络字节序长整型转点分十进制数串IPv4/IPv6通用(推荐)

    代码举例

    我们首先定一个char型字符串,然后将该字符数串转化为IP地址类型,具体代码如下:

    #include <iostream>
    #include <cstring>
    #include <arpa/inet.h>
    
    using namespace std;
    
    int main(){
        const char* ip = "127.0.0.1";
        struct in_addr addr;
        int res = inet_aton(ip,&addr);
        if(res == 0){
            perror("inet_Aton error");
        }
    
        cout << addr.s_addr << endl;
        cout << inet_ntoa(addr) << endl;
        cout << inet_ntoa(addr) << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果如下:

    在这里插入图片描述

  • 相关阅读:
    miniblink学习
    [PAT练级笔记] 34 Basic Level 1034 有理数四则运算
    YAYA LIVE CTO 唐鸿斌:真正本地化,要让产品没有「产地」属性
    天宇优配|北上广深角逐“国字号”数据交易所 行业爆点
    去除重复数据
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java我为群众办实事资料管理系统58g55
    10、JAVA入门——多重循环及程序调试
    C高级day1
    C++之6|多态与异常
    数据库-范式
  • 原文地址:https://blog.csdn.net/weixin_50941083/article/details/124955281