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

C语言socket设置端口49255报Connection refused 端口显示为0

故障根因

两个核心错误直接触发端口异常、连接拒绝:

  • 字节序转换函数用错:sockaddr_in的sin_port是16位无符号短整型,端口号做主机序到网络序转换必须用16位函数htons(),你两端代码都误用了32位转换函数htonl()。
    端口49255的十六进制值是0xC067,在主流小端架构主机上,作为32位整数存储时值为0x0000C067,经htonl()转成32位大端网络序后值为0x67C00000,赋值给16位的sin_port时会直接截断低16位,结果就是0x0000,也就是你看到的打印值0。端口0是系统保留端口,服务端无法正常绑定到固定业务端口,客户端向0端口发起连接会直接被拒绝,和你观察到的报错完全吻合。
  • 代码存在低级笔误:客户端代码里把标准输出函数printf错写为print,传参时还多写了无效标识符n,本身就会导致输出逻辑异常。另外客户端作为连接发起方,目标地址不能设为INADDR_ANY——这个宏是给服务端绑定所有网卡地址用的,客户端连接本地服务端必须指定回环地址。
修复步骤
  • 把客户端、服务端所有sin_port赋值处的htonl(49255)替换为htons(49255),严格匹配16位字段的字节序转换要求。
  • 修正客户端打印语句的笔误:把print改为printf,删除参数里多余的n。
  • 客户端初始化目标地址时,将sin_addr.s_addr设置为htonl(INADDR_LOOPBACK)(对应本地回环地址127.0.0.1),适配同主机部署的连接场景。
  • 所有打印网络序存储的端口值的位置,统一用ntohs()转回主机序再输出,避免打印值和实际配置值不符。
修复后参考代码

客户端结构体初始化代码

void init_struct(struct sockaddr_in *adress, long unsigned int ip) {
    memset(adress, 0, sizeof(struct sockaddr_in));
    adress->sin_family = AF_INET;
    adress->sin_port = htons(49255);
    adress->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    printf("Set port to %d\n", ntohs(adress->sin_port));
}

服务端结构体初始化代码

void init_struct(struct sockaddr_in* server) {
    memset(server, 0, sizeof(struct sockaddr_in));
    server->sin_family = AF_INET;
    server->sin_addr.s_addr = htonl(INADDR_ANY);
    server->sin_port = htons(49255);
    printf("Set port to %d\n", ntohs(server->sin_port));
}

内容的提问来源于stack exchange,提问作者zlSxrtig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:33:25