• 如何将字符数串和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

    运行结果如下:

    在这里插入图片描述

  • 相关阅读:
    D359周赛复盘:贪心解决求最小和问题⭐⭐+较为复杂的双层线性DP⭐⭐
    英语——分享篇——每日200词——2201-2400
    电路的基本定律——基尔霍夫定律
    DataStream API(一)
    第四章IDEA操作Maven
    Nwafu-OJ-1485 Problem o C语言实习题八——单链表结点的阶乘和
    这篇文章汇聚33个BUG!来挑战一下,看看你能找出来几个?
    C#:实现图像相似度算法​(附完整源码)
    golang知识点整理
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校心理咨询管理系统0e78p
  • 原文地址:https://blog.csdn.net/weixin_50941083/article/details/124955281