> 文章列表 > 4.12、ip地址转换函数

4.12、ip地址转换函数

4.12、ip地址转换函数

4.12、ip地址转换函数

  • 1.IP地址转换(字符串ip-整数 ,主机、网络字节序的转换)
  • 2.转换函数的代码举例

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_INET6src:需要转换的点分十进制的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_INET6src: 要转换的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;
}