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>
int inet_pton(int af, const char *src, void *dst);功能:将点分十进制字符串转换为网络字节流整数参数:af:地址族: AF_INET AF_INET6src:需要转换的点分十进制的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_INET6src: 要转换的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;
}