VS2015中IP地址转换函数

主机IP地址可以用标准的点型字符串来表示,如“192.168.1.1”,也可以用一个四个字节的整数或IN_ADDR结构来表示。可以使用inet_addr()函数和inet_ntoa()函数来实现这两种格式的转换,也可以使用新版本的inet_ntop()函数和inet_pton()函数来进行转换。

1 inet_pton()函数

1.1 函数格式

该函数的作用是将标准的点型IP地址转换为二进制数字形式。pton中的p表示表达式(presentation),n表示二进制数字(numeric binary)。该函数的格式为

WINSOCK_API_LINKAGE INT WSAAPI inet_pton(

INT Family

, PCSTR pszAddrString

, PVOID pAddrBuf

);

其中,参数Family表示地址族,地址族的值都在Ws2def.h中定义,该头文件自动包含在Winsock2.h头文件中。如果使用的IPv4格式的IP地址,则地址族的值是AF_INET;如果使用的是IPv6格式的IP地址,则地址族的值是AF_INET6。需要注意的是,该参数的格式是INT,因此,可以将该参数直接设置为整数,AF_INET对应的值是2,AF_INET6对应的值是23。参数pszAddrString是以null为结尾的字符串,该字符串包含了要转换的标准的点型IP地址。参数pAddrBuf是一个缓冲区的指针,转换后的二进制数字就保存在该指针指向的内容中。

1.2 返回值

如果转换成功,inet_pton()函数返回1;如果参数pszAddrString的格式不正确,则inet_pton()函数0;如果转换失败,则返回-1。

需要注意的是

  1. inet_pton()函数在ws2tcpip.h头文件中定义;
  2. inet_pton()函数的宽字符版本是inetPton();

1.3 使用

int ipNumeric1 = 0;

IN_ADDR ipNumeric2;

int ret1 = inet_pton(AF_INET, "192.168.1.1", &ipNumeric1);

int ret2 = inet_pton(AF_INET, "192.168.1.1", &ipNumeric2);

ipNumeric1是一个四个字节的整形,ipNumeric2是IN_ADDR结构的对象。其值如图1所示。

VS2015中IP地址转换函数_第1张图片

图1 ipNumeric1和ipNumeric2的值

inet_ntop()函数

2.1 函数格式

该函数的作用是二进制数字形式的IP地址转换为标准的点型IP地址。该函数的格式为

PCSTR WSAAPI inet_ntop(

INT Family

, const VOID *pAddr

, PSTR pStringBuf

, size_t StringBufSize

);

其中,参数Family表示地址族;pAddr是要转换的二进制数字形式的IP地址的地址;pStringBuf表示转换后的标准的点型IP地址;StringBufSize表示pStringBuf的长度。

2.2 返回值

如果转换成功,inet_ntop()函数返回包含标准的点型IP地址的字符串的地址,即参数pStringBuf的地址;如果转换失败,则返回值是NULL。

需要注意的是

(1)inet_ntop()函数在ws2tcpip.h头文件中定义;

(2)inet_ntop()函数的宽字符版本是inetNtop();

2.3 使用

char ipPresentation[20] = {};

const char* ret3 = inet_ntop(AF_INET, &ipNumeric1, ipPresentation, sizeof(ipPresentation));

其中,ipPresentation保存了转换后的标准点型IP地址,ret3保存了ipPresentation的地址,如图2所示。

 

图2 ipPresentation与ret3的值

你可能感兴趣的:(网络编程)