主机IP地址可以用标准的点型字符串来表示,如“192.168.1.1”,也可以用一个四个字节的整数或IN_ADDR结构来表示。可以使用inet_addr()函数和inet_ntoa()函数来实现这两种格式的转换,也可以使用新版本的inet_ntop()函数和inet_pton()函数来进行转换。
该函数的作用是将标准的点型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是一个缓冲区的指针,转换后的二进制数字就保存在该指针指向的内容中。
如果转换成功,inet_pton()函数返回1;如果参数pszAddrString的格式不正确,则inet_pton()函数0;如果转换失败,则返回-1。
需要注意的是
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所示。
图1 ipNumeric1和ipNumeric2的值
该函数的作用是二进制数字形式的IP地址转换为标准的点型IP地址。该函数的格式为
PCSTR WSAAPI inet_ntop(
INT Family
, const VOID *pAddr
, PSTR pStringBuf
, size_t StringBufSize
);
其中,参数Family表示地址族;pAddr是要转换的二进制数字形式的IP地址的地址;pStringBuf表示转换后的标准的点型IP地址;StringBufSize表示pStringBuf的长度。
如果转换成功,inet_ntop()函数返回包含标准的点型IP地址的字符串的地址,即参数pStringBuf的地址;如果转换失败,则返回值是NULL。
需要注意的是
(1)inet_ntop()函数在ws2tcpip.h头文件中定义;
(2)inet_ntop()函数的宽字符版本是inetNtop();
char ipPresentation[20] = {};
const char* ret3 = inet_ntop(AF_INET, &ipNumeric1, ipPresentation, sizeof(ipPresentation));
其中,ipPresentation保存了转换后的标准点型IP地址,ret3保存了ipPresentation的地址,如图2所示。
图2 ipPresentation与ret3的值