IP地址转换函数

人们习惯用可读性好的字符串来表示IP地址,比如用点分十进制字符串表示IPv4地址,十六进制表示IPv6地址。
下面3个函数用于点分十进制字符串表示的IPv4地址及用网络字节序整数表示的IPv4地址之间的转换:

#include <arpa/inet.h>

in_addr_t inet_addr(const char* strptr);
int inet_aton(const char* cp, struct in_addr* inp);
char* inet_ntoa(struct in_addr in);

inet_addr函数将用点分十进制字符串表示的IPv4地址转化为用网络字节序整数表示的IPv4地址。
失败时返回INADDR_NONE。

inet_aton函数完成和inet_addr同样的功能,但是将转化结果存储于参数inp指向的地址结构中。
成功返回1,失败返回0。

inet_ntoa函数将用网络字节序整数表示的IPv4地址转化为用点分十进制字符串表示的IPv4地址。
该函数内部用一个静态变量存储转化的结果,函数返回值指向该静态内存,因此inet_ntoa是不可重入的。

不可重入的inet_ntoa函数:

char* szValue1 = inet_ntoa("1.2.3.4");
char* szValue2 = inet_ntoa("5.6.7.8");

printf("address 1: %s\n", szValue1);
printf("address 2: %s\n", szValue2);

运行结果:
address1: 5.6.7.8
address2: 5.6.7.8

更新的函数
下面两个新的函数也可完成前面三个函数的功能,可用于IPv4和IPv6地址:

#include <arpa/inet.h>

int inet_pton(int af, const char* src, void* dst);
const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);

inet_pton函数将用字符串表示的IP地址src(点分十进制IPv4或十六进制IPv6字符串)转换成网络字节序整数表示的IP地址,并把转换结果存储于dst指向的内存中。

参数af:指定地址族,AF_INET或者AF_INET6。
返回值:
成功返回1,失败返回0并设置errno。

inet_ntop函数进行相反的转换,前三个参数的含义与inet_pton的参数相同,最后一个参数cnt指定目标存储单元的大小。
下面两个宏助我们指定这个大小:

#include <netinet/in.h>
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46

inet_ntop成功时返回目标存储单元的地址,失败返回NULL并设置errno。

《Linux高性能服务器编程》

你可能感兴趣的:(IP转换)