设为首页 收藏本站
查看: 1982|回复: 0

[经验分享] 关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

[复制链接]

尚未签到

发表于 2015-11-23 15:56:02 | 显示全部楼层 |阅读模式
今天在VS2013中调试Socket代码时,遇到了点小问题:

问题代码为:

inet_ntoa(addrClient.sin_addr);

  生成错误消息为:
error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
1>          c:\program files (x86)\windows kits\8.1\include\um\winsock2.h(1868) : 参见“inet_ntoa”的声明

  看到这条消息就有点懵了,之前在VS2010中好好的,怎么在这里就不行了。
然后试着把SDL检查关闭,发现可以通过,但是error变成了warning。先说一下SDL关闭:在“项目”-“属性”-“配置属性”-“C/C++”-“常规”下,有一项“SDL检查”,把“是
(/sdl)”改为“否 (/sdl-)”就可以了。

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


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

char FAR *
WSAAPI
inet_ntoa(
_In_ struct in_addr in
);

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

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

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

那么,修改后的代码为:

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





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






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-142763-1-1.html 上篇帖子: 网络编程:inet_ntoa inet_aton inet_ntop和inet_pton分不清楚 下篇帖子: Linux下网络IP地址的转换,主机字节顺序和网络字节顺序的转换。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表