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
相关产品推荐
相关产品推荐

