在使用visual studio开发程序时,使用了inet_ntoa,编译时提示:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C4996 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings iocpsys C:\Users\Administrator\source\repos\iocpsys\iocpserver.cpp 19
上网查阅了一下,inet_ntoa 和inet_ntop函数的区别和共同点:
共同点:两者功能都是将网络地址转换成“.”点隔的字符串格式。
不同点:1.参数数量不同,使用方法有小区别
2.inet_ntoa只适用于ipv4地址,而inet_ntop适用ipv4和ipv6地址
3.前者是旧函数,后者是新函数
inet_ntop函数说明:
PCSTR WSAAPI inet_ntop(
[in] INT Family,
[in] const VOID *pAddr,
[out] PSTR pStringBuf,
[in] size_t StringBufSize
);
这个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。函数名中的p和n非别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构中的二进制值。
这个函数的family参数既可以是AF_INET,也可以是AF_INET6。如果以不被支持的地址族作为family的参数,这个函数就会返回一个错误,并将errno置为EAFNOSUPPORT。通过WSAGetLastError可取得错误值。
该函数尝试转换由*pAddr指针所指的二进制值,并通过pStringBuf指针存放字符串结果。StringBufSize是pStringBuf缓冲区大小,以免该函数溢出其调用者的缓冲区。对于ipv4地址,这个缓冲区大小必须大于16个字符,对于ipv6地址,缓冲区必须大于46字符。
在正确转换的情况下,该函数的返回值是一个指向存放转换后字符串的指针。
inet_ntop用法:
引入相关头文件,windows下为:
#include <ws2tcpip.h>
linux下为:
#include<arpa/inet.h>
具体使用代码:
char buff[17];
::inet_ntop(AF_INET,(const void *)&addrRemote.sin_addr,buff,17);
//方法1
printf("转换后ip为:%s",buff);
//或者方法2
printf("转换后ip为:%s",::inet_ntop(AF_INET,(const void *)&addrRemote.sin_addr,buff,17));
inet_pton与 inet_ntop正好相反,将ip字符串转换为二进制值。