inet_addr、inet_ntoa、inet_pton、inet_ntop用法
1.分别利用函数 inet_addr、inet_pton ,将“字符串”192.168.12.13“转化位4字节整型数。
分别利用函数 inet_ntoa 、inet_ntop,将上面转换后的4字节整型数转换位字符串并输出。
inet_addr():
函数原型:unsigned long inet_addr (const char * cp);
功能:将点分十进制字符串表示的IP地址转换为32位的无符号长整型数,它是以网络字节顺序表示的32位二进制IP地址。
如果传入的字符串是一个非法的IP地址,函数返回值是常量INADDR_NONE。
inet_ntoa():
函数原型:char * inet_ntoa (struct in_addr in);
功能:将一个包含在in_addr结构变量in中的长整型IP地址转换点分十进制形式。
参数:是一个保存有32位二进制IP地址的in_addr结构变量。
函数调用成功返回一个字符指针,该指针指向一个char型缓冲区,该缓冲区保存有由参数in的值转换而来的点分十进制表示的IP地址字符串。如果函数调用失败,则返回一个空指针NULL。
void exchange()
{
auto one = inet_addr("192.168.12.13");
if (one!= INADDR_NONE)
{
cout << one << endl;
}
SOCKADDR_IN sockaddr;
sockaddr.sin_addr.S_un.S_addr = inet_addr("192.168.12.13");
auto pAddr = inet_ntoa(sockaddr.sin_addr);
if (pAddr != NULL)
{
cout << pAddr << "\n";
}
}
inet_pton():
int inet_pton(int af, const char *src, void *dst);
功能:inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。
参数:
1.Af或AF_INET、AF_INET6
2.src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址转换为in_addr的结构体,并复制在*dst中。
3.af =src为指向IPV6的地址,函数将该地址转换为in6_addr的结构体,并复制在*dst中。
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。
inet_ntop():
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
从数值格式(addrptr)转换到表达式(strptr)。
inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值。
len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。如果len太小,不足以容纳表达式结果,那么返回一个空指针,并置为errno为ENOSPC。
void exchange1()
{
char szAddress[20] = {0};
int b = 0; //初始化一个整形变量,用于存储转换后的四字节整型数
int nRetValue = inet_pton(AF_INET, "192.168.12.13", &b);
if (nRetValue)
{
cout << b << endl;
auto pAddress = inet_ntop(AF_INET, &b, szAddress, sizeof(szAddress));
if (pAddress != NULL)
{
cout << pAddress <<endl;
}
}
}
2.利用函数inet_pton、inet_ntop,将"2001:3211::1", 转换位IPV6地址,并转换字符串输出。
inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。
inet_pton和inet_ntop支持AF_INET和AF_INET6
void exchange3()
{
char szAddress[20] = { "2001:3211::1" };
struct sockaddr_in6 sinp6;
int nRetValue = inet_pton(AF_INET6, szAddress, (void*)&sinp6);
if (nRetValue)
{
auto pAddress = inet_ntop(AF_INET6,(void*)&sinp6, szAddress, sizeof(szAddress));
if (pAddress != NULL)
{
cout << szAddress << endl;
}
}
}
运行实例
218933440
192.168.12.13
218933440
192.168.12.13
2001:3211::1