warning C4996: ‘inet_addr‘: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_W
·
之前用vs2010写的一段代码,现在移植到vs2022上,编译出现warning:
warning C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
查了一下,原来inet_addr函数已经被废弃,建议使用 inet_pton()
问题原因与解决方案
inet_addr 是一个老旧的 IPv4 地址转换函数,微软在新版 SDK 中将其标记为废弃(deprecated),主要是因为它不支持 IPv6,且错误处理能力较弱。下面提供两种解决方案:
方案 1:使用推荐的 inet_pton() 替代(推荐)
inet_pton() 是跨平台的标准函数,支持 IPv4 和 IPv6,是更现代的写法。以下是修改后的完整代码:
#include <winsock2.h>
#include <ws2tcpip.h> // 必须包含此头文件以使用 inet_pton
#pragma comment(lib, "ws2_32.lib") // 链接Winsock库
// 假设你已定义 strServerIP(字符串类型)和 nPort(整数类型)
const char* strServerIP = "127.0.0.1";
u_short nPort = 8080;
SOCKADDR_IN addrSrv;
// 替换 inet_addr,使用 inet_pton 转换IP地址
if (inet_pton(AF_INET, strServerIP, &addrSrv.sin_addr) != 1) {
// 转换失败,处理错误(比如IP格式非法)
printf("IP地址转换失败,错误码:%d\n", WSAGetLastError());
return -1;
}
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(nPort);
SOCKET ClientSocket = socket(AF_INET, SOCK_STREAM, 0);
// 检查socket创建是否成功
if (ClientSocket == INVALID_SOCKET) {
printf("创建Socket失败,错误码:%d\n", WSAGetLastError());
WSACleanup();
return -1;
}
关键代码解释:
inet_pton(AF_INET, strServerIP, &addrSrv.sin_addr):- 第一个参数
AF_INET表示处理 IPv4 地址; - 第二个参数是待转换的 IP 字符串(如 "127.0.0.1");
- 第三个参数是输出地址,直接写入
addrSrv.sin_addr; - 返回值:成功返回 1,失败返回 0(IP 格式错误)或 -1(系统错误)。
- 第一个参数
重新编译,警告就没有啦
更多推荐


所有评论(0)