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>
int inet_pton(int af, const char *src, void *dst);
功能:将点分十进制字符串转换为网络字节流整数
参数:
af:地址族: AF_INET AF_INET6
src:需要转换的点分十进制的IP字符串
dst:转换后的结果保存在这个里面
返回值:
- 1:转换成功
- 0:src不正确
- -1:错误并设置errno
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() {
char ip[]{"192.168.1.1"};
unsigned int ipNum;
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];
const char * str = inet_ntop(AF_INET, &ipNum, pnstr, sizeof(pnstr));
cout << pnstr << " " << str << endl;
cout << (pnstr == str) << endl;
return 0;
}