You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:18:01