关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr


VS2013中调试Socket代码时,遇到了点小问题:

问题代码为:

[cpp]  view plain  copy
  1. inet_ntoa(addrClient.sin_addr);  

生成错误消息为:

[plain]  view plain  copy
  1. error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings  
  2. 1>          c:\program files (x86)\windows kits\8.1\include\um\winsock2.h(1868) : 参见“inet_ntoa”的声明  

看到这条消息就有点懵了,之前在VS2010中好好的,怎么在这里就不行了。

然后试着:

1. 把SDL检查关闭,发现可以通过,但是error变成了warning。先说一下SDL关闭:在“项目”-“属性”-“配置属性”-“C/C++”-“常规”下,有一项“SDL检查”,把“是 (/sdl)”改为“否(/sdl-)”就可以了。

2. 加上语句: #pragma comment(lib, "ws2_32.lib")

SDL安全检查在VS2010中是没有的,从VS2012开始就有了。inet_pton和inet_ntop这2个IP地址转换函数,能够处理ipv4和ipv6,算是比较新的函数了,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。SDL提示错误可能是推荐使用相对安全的函数吧。那么,关闭了SDL确实可以了,但warning还在啊,所以找个更好的办法。

首先根据提示看看“inet_ntoa”的声明,在头文件WinSock2.h中:

[cpp]  view plain  copy
  1. char FAR *  
  2. WSAAPI  
  3. inet_ntoa(  
  4.     _In_ struct in_addr in  
  5. );  

Inet_ntoa的参数是一个in_addr的结构体。这个结构体将一个点分十进制格式的IP地址转换为u_long类型,保存在S_addr中。

再看看inet_ntop的定义,在文件WS2tcpip.h中:

[cpp]  view plain  copy
  1. PCSTR  
  2. WSAAPI  
  3. inet_ntop(  
  4.     _In_                                INT             Family,  
  5.     _In_                                PVOID           pAddr,  
  6.     _Out_writes_(StringBufSize)         PSTR            pStringBuf,  
  7.     _In_                                size_t          StringBufSize  
  8. );  
第一个参数(Family)指定地址族,对于TCP/IP协议的套接字,地址族为AF_INET;第二个参数(pAddr)指向套接字的IP地址(sin_addr);第三个参数(pStringBuf)是字符串缓冲区;第四个参数(StringBufSize)指定缓冲区的大小,这里值为16,用来保存点分十进制格式的IP地址。

那么,修改后的代码为:

[cpp]  view plain  copy
  1. // char sendBuf[100];  
  2. // SOCKADDR_IN addrClient;  
  3.   
  4. inet_ntop(AF_INET, (void*)&addrClient.sin_addr, sendBuf, 16);  
再次编译就没有警告了。注:inet_ntop函数成功的话返回字符串的首地址,错误返回NULL。

inet_pton功能与inet_ntop正好相反,将“点分十进制” 转换为 “二进制整数”。
[cpp]  view plain  copy
  1. INT  
  2. WSAAPI  
  3. inet_pton(  
  4.     _In_                                      INT             Family,  
  5.     _In_                                      PCSTR           pszAddrString,  
  6.     _Out_writes_bytes_(sizeof(IN6_ADDR))      PVOID           pAddrBuf  
  7.     );  
注:inet_pton 函数成功的话返回1,参数无效返回0,错误返回-1。

VS2013中调试Socket代码时,遇到了点小问题:

问题代码为:

[cpp]  view plain  copy
  1. inet_ntoa(addrClient.sin_addr);  

生成错误消息为:

[plain]  view plain  copy
  1. error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings  
  2. 1>          c:\program files (x86)\windows kits\8.1\include\um\winsock2.h(1868) : 参见“inet_ntoa”的声明  

看到这条消息就有点懵了,之前在VS2010中好好的,怎么在这里就不行了。

然后试着:

1. 把SDL检查关闭,发现可以通过,但是error变成了warning。先说一下SDL关闭:在“项目”-“属性”-“配置属性”-“C/C++”-“常规”下,有一项“SDL检查”,把“是 (/sdl)”改为“否(/sdl-)”就可以了。

2. 加上语句: #pragma comment(lib, "ws2_32.lib")

SDL安全检查在VS2010中是没有的,从VS2012开始就有了。inet_pton和inet_ntop这2个IP地址转换函数,能够处理ipv4和ipv6,算是比较新的函数了,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。SDL提示错误可能是推荐使用相对安全的函数吧。那么,关闭了SDL确实可以了,但warning还在啊,所以找个更好的办法。

首先根据提示看看“inet_ntoa”的声明,在头文件WinSock2.h中:

[cpp]  view plain  copy
  1. char FAR *  
  2. WSAAPI  
  3. inet_ntoa(  
  4.     _In_ struct in_addr in  
  5. );  

Inet_ntoa的参数是一个in_addr的结构体。这个结构体将一个点分十进制格式的IP地址转换为u_long类型,保存在S_addr中。

再看看inet_ntop的定义,在文件WS2tcpip.h中:

[cpp]  view plain  copy
  1. PCSTR  
  2. WSAAPI  
  3. inet_ntop(  
  4.     _In_                                INT             Family,  
  5.     _In_                                PVOID           pAddr,  
  6.     _Out_writes_(StringBufSize)         PSTR            pStringBuf,  
  7.     _In_                                size_t          StringBufSize  
  8. );  
第一个参数(Family)指定地址族,对于TCP/IP协议的套接字,地址族为AF_INET;第二个参数(pAddr)指向套接字的IP地址(sin_addr);第三个参数(pStringBuf)是字符串缓冲区;第四个参数(StringBufSize)指定缓冲区的大小,这里值为16,用来保存点分十进制格式的IP地址。

那么,修改后的代码为:

[cpp]  view plain  copy
  1. // char sendBuf[100];  
  2. // SOCKADDR_IN addrClient;  
  3.   
  4. inet_ntop(AF_INET, (void*)&addrClient.sin_addr, sendBuf, 16);  
再次编译就没有警告了。注:inet_ntop函数成功的话返回字符串的首地址,错误返回NULL。

inet_pton功能与inet_ntop正好相反,将“点分十进制” 转换为 “二进制整数”。
[cpp]  view plain  copy
  1. INT  
  2. WSAAPI  
  3. inet_pton(  
  4.     _In_                                      INT             Family,  
  5.     _In_                                      PCSTR           pszAddrString,  
  6.     _Out_writes_bytes_(sizeof(IN6_ADDR))      PVOID           pAddrBuf  
  7.     );  
注:inet_pton 函数成功的话返回1,参数无效返回0,错误返回-1。

猜你喜欢

转载自blog.csdn.net/u012422855/article/details/78205783
今日推荐