inet_pton, inet_ntop是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。
inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。
函数定义:
#include<arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);
返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
返回:若成功则为指向结果的指针, 若出错则为NULL
参数:
这两个函数的family参数既可以是AF_INET,也可以是AF_INET6。
src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址转换为in_addr的结构体,并复制在*dst中。
len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
函数使用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void)
{
struct in_addr s;
char IPdotdec[20] = {0};
//"1.2.3.4" ----> 0x4030201
inet_pton(AF_INET, "1.2.3.4", (void *)&s);
printf("inet_pton: 0x%x\n", s.s_addr); // 注意得到的字节序
//0x4030201 ---> "1.2.3.4"
inet_ntop(AF_INET, (void *)&s, IPdotdec, INET_ADDRSTRLEN);//INET_ADDRSTRLEN 16, INET6_ADDRSTRLEN 46
printf("inet_ntop: %s\n", IPdotdec);
}
#if 0
最终:
toney@sw2:~/study/network$ gcc inet_pton.c
toney@sw2:~/study/network$ ./a.out
inet_pton: 0x4030201
inet_ntop: 1.2.3.4
#endif