当前位置: 首页 > 工具软件 > ntop > 使用案例 >

inet_ntoa 和inet_ntop函数

闽涵蓄
2023-12-01

在使用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字符串转换为二进制值。

 类似资料: