4.12、ip地址转换函数

1.IP地址转换(字符串ip-整数 ,主机、网络字节序的转换)

  • 通常,人们习惯用可读性好的字符串来表示 IP 地址,比如用点分十进制字符串表示 IPv4 地址,以及用十六进制字符串表示 IPv6 地址。但编程中我们需要先把它们转化为整数(二进制数)方能使用。而记录日志时则相反,我们要把整数表示的 IP 地址转化为可读的字符串。下面 3 个函数可用于用点分十进制字符串表示的 IPv4 地址和用网络字节序整数表示的 IPv4 地址之间的转换:
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);
char *inet_ntoa(struct in_addr in);
  • (上面函数基本不会再使用)下面这对更新的函数也能完成前面 3 个函数同样的功能,并且它们同时适用 IPv4 地址和 IPv6 地址:
#include <arpa/inet.h>
// p:点分十进制的IP字符串,n:表示network,网络字节序的整数
int inet_pton(int af, const char *src, void *dst);
    功能:将点分十进制字符串转换为网络字节流整数
    参数:
        af:地址族: AF_INET  AF_INET6
        src:需要转换的点分十进制的IP字符串
        dst:转换后的结果保存在这个里面
    返回值:
        - 1:转换成功
        - 0:src不正确
        - -1:错误并设置errno


// 将网络字节序的整数,转换成点分十进制的IP地址字符串
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
    功能:将网络字节流整数转换为点分十进制字符串
    参数:
        af:地址族: AF_INET  AF_INET6
        src: 要转换的ip的整数的地址
        dst: 转换成IP地址字符串保存的地方
        size:第三个参数的大小(数组的大小)
    返回值:返回转换后的数据的地址(字符串),和 dst 是一样的

2.转换函数的代码举例

#include <iostream>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdio.h>

using namespace std;

int main() {
    
    

    // 定义ip地址的点分十进制字符串形式
    char ip[]{
    
    "192.168.1.1"};
    unsigned int ipNum;
    // 将ip点分十进制字符串转换为网络字节流整数
    int retIp = inet_pton(AF_INET, ip, &ipNum);
    
    // 返回值
    if (retIp == 0) {
    
    
        cout << "ip字符串的地址不正确" << endl;
        exit(0);
    } else if (retIp == -1) {
    
    
        perror("inet_pton");
        exit(0);
    }

    // 将取出的整数转换为一个字符串,将每一个字节输出
    unsigned char * strpn = (unsigned char *) &ipNum;

    // 输出转换结果
    printf("%d %d %d %d\n", strpn[0], strpn[1], strpn[2], strpn[3]);

    cout << "---------------------------------------" << endl;
    
    // 函数的传出参数
    char pnstr[16];

    // 将网络字节流转换为ip的点分十进制的字符串
    const char * str = inet_ntop(AF_INET, &ipNum, pnstr, sizeof(pnstr));
    
    // 输出转换之后的结果
    cout << pnstr << " " << str << endl;
    // 两个地址是相等的
    cout << (pnstr == str) << endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/z2812470857/article/details/130171173