none
关于socket连接ip转换 RRS feed

  • 问题

  • 用地址包sockaddr_in, 正常情况下用inet_addr和inet_ntoa进行ip转换,用conncet连接服务端,正常。但因为visual studio 2013有提示建议用InetPton替代inet_addr,InetNtop替换inet_ntoa. 用InetNtop和InetPton互转都成功。但是,用InetNtop和InetPton转换出来的数据封装到sockaddr_in里面,再传到connect后,连接一直失败,怀疑是connect内部依旧是用旧方式inet_ntoa进行转换。

    那么用connect就得配套使用旧库inet_addr和inet_ntoa才能正常,这样,InetNtop和InetPton还有什么意义?要配套新的connect?还是仅仅用于IPv6解析?


    2016年11月5日 16:06

全部回复

  • Hi MicroLeoChan,

    感谢在MSDN论坛发帖。

    >>但是,用InetNtop和InetPton转换出来的数据封装到sockaddr_in里面,再传到connect后,连接一直失败,怀疑是connect内部依旧是用旧方式inet_ntoa进行转换。

    那么用connect就得配套使用旧库inet_addr和inet_ntoa才能正常,这样,InetNtop和InetPton还有什么意义?要配套新的connect?还是仅仅用于IPv6解析?

    InetNtopInetPton是用来将IPv4或IPv6网络地址转换为网络标准格式或者将它的标准文本表示形式转换为其数字二进制形式。这两个函数的ANSI 版本分别是inet_ntoa和inet_pton。还有一点就是InetNtop和InetPton是支持IPv6的,而inet_ntoa和inet_pton只支持IPv4。

    在IPv4传输时,他们都需要封装成 IN_ADDR 结构体传入sockaddr_in中。但是在IPv6传输时,InetNtop和InetPton需要将网络地址转换为IN6_ADDR 格式传输。他们都是能和sockaddr_in配套的,因为sockaddr_in使用的就是in_addr 格式的网络地址。你不能正常使用可能是你的使用方式不正确。请将你具体使用的代码发布上来,方便我们查找根本原因。

    这里有一篇示例,可能会对你有所帮助。

    http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedInternet3c.html

    Best Regards,

    Sera Yu

    ----------

    Note: This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; Therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there.


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Baron Bi 2016年11月18日 9:17
    2016年11月7日 2:34