'inet_addr': 使用inet_pton()或InetPton()代替或定义_WINSOCK_DEPRECATED_NO_WARNINGS。

31

我正在使用Visual Studio 2015,并尝试编译此前在VS 2013上运行的代码。

'inet_addr': 使用inet_pton()或InetPton()代替,或者定义_WINSOCK_DEPRECATED_NO_WARNINGS。

代码如下:

partner.sin_addr.s_addr = inet_addr(ip.c_str());

我尝试使用提到的函数,但它们未定义。我尝试在许多不同的位置定义宏,但没有任何效果。另一个线程说我应该包括Ws2tcpip.h而不是WinSock2,并添加Ws2_32.lib。我已经添加了库,当我使用包含时什么也没发生。出了什么问题?

4个回答

38

为了让转换更清楚明白,我们假设你有一段使用已弃用的inet_addr函数的代码,就像这个例子:

RecvAddr.sin_addr.s_addr = inet_addr("192.168.1.1");

它可以转换为更新的InetPton,如下所示:

InetPton(AF_INET, _T("192.168.1.1"), &RecvAddr.sin_addr.s_addr);

_T 宏可以防止出现“const char 与 PCWSTR 不兼容”错误。


替代转换:(PCWSTR)("192.168.1.1") - _T 可能会误导,而且速记法对我不起作用,注意仍需要头文件。 - Jamie Nicholl-Shelley
3
替代方案:InetPton(AF_INET, L"192.168.1.1", &RecvAddr.sin_addr.s_addr); - sipsorcery

26

可以使用InetPton函数将ip字符串转换为in_addr结构。

使用方法如下:

InetPton(AF_INET, strIP, &ipv4addr)

你需要包含 "Ws2tcpip.h" 头文件,使用库 "Ws2_32.lib" 和 DLL "Ws2_32.dll"。


11

你可以尝试

#pragma warning(disable:4996) 

关于使用inet_addr()的内容。


0
确保在所有包含语句之前定义“_WINSOCK_DEPRECATED_NO_WARNINGS”。

8
这个警告是有原因的。简单地建议设置该定义会加强不良风格,并延迟警告所指向的现代化代码的需要。例如,使用inet_addr会导致线程安全问题。即使在本地禁用弃用警告也比这个选项更好,因为它可以让问题变得明显可见。 - 0xC0000022L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接