Windows10环境C语言Socket编程inet_addr编译报错问题咨询
错误原因
inet_addr是Windows Winsock提供的传统IPv4地址转换函数,官方定义的原型仅接收1个输入参数:unsigned long inet_addr(const char *cp);,参数为点分十进制格式的IPv4字符串,返回值是网络字节序的32位IPv4地址值。你代码中给该函数传递了2个参数,不符合函数定义,直接触发参数数量不匹配的编译错误。
是否可以用inet_aton替换解决
Windows平台原生不支持inet_aton函数,该函数属于POSIX标准定义的接口,仅适用于Linux/类Unix系统,无法用来解决Windows平台下的该编译问题。
正确修复方案
方案1:修正inet_addr的调用方式
直接将原inet_addr行修改为如下写法即可:
servaddr.sin_addr.s_addr = inet_addr("你实际的本地IP地址,例如192.168.1.10");
补充提示:如果传入的IP格式非法,
inet_addr会返回INADDR_NONE(即0xFFFFFFFF),建议增加返回值判断逻辑避免后续运行错误。
方案2(更推荐):改用兼容性更好的inet_pton函数
你已经引入了Ws2tcpip.h头文件,可直接使用更规范、同时兼容IPv4/IPv6的inet_pton接口,写法如下:
inet_pton(AF_INET, "你实际的本地IP地址", &servaddr.sin_addr);
该函数返回值大于0代表地址转换成功,返回0代表IP格式非法,返回-1代表地址族参数错误,更便于错误排查。
其他Windows平台适配注意事项
你当前的代码还存在多个Windows Winsock编程的适配问题,不修正会导致运行报错:
- Winsock使用前必须初始化,需要在调用所有socket相关函数前添加初始化逻辑,示例如下:
WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); - Windows平台没有POSIX标准的
read函数,读取套接字数据需改用recv函数;也没有close函数关闭套接字,需改用closesocket函数。 - 代码中用到的
bzero是POSIX专属接口,Windows下可以替换为ZeroMemory(&servaddr, sizeof(servaddr))或者memset(&servaddr, 0, sizeof(servaddr))。 - 无需引入
unistd.h头文件,该头文件为类Unix系统专属,Windows下不存在,直接删除即可。
内容的提问来源于stack exchange,提问作者Damien
相关产品推荐
相关产品推荐

