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

Debian10下C语言IPv6 Socket连接报错111拒绝连接问题咨询

错误原因

errno 111对应ECONNREFUSED,即服务端主动拒绝了连接,结合给出的代码,核心问题是Linux系统下sockaddr_in6结构体不存在sin6_len成员,手动赋值该字段触发了内存越界,破坏了结构体的其他配置:

  • sin6_len是BSD系系统特有的结构体成员,Linux的IPv6套接字地址结构的第一个字段直接是2字节的sin6_family,没有前置的长度字段。
  • 越界赋值会覆盖sin6_port或者sin6_flowinfo的内容,导致服务端实际监听的端口和预期的7770不一致,客户端连接7770自然会被拒绝。

解决方法

  1. 直接删除服务端gw_server_socket_init函数中设置sin6_len的代码行:
// 删掉下面这行即可
serv_addr->sin6_len = sizeof(struct sockaddr_in6);
  1. 服务端启动后执行以下命令验证监听状态,确认7770端口正常在IPv6地址上监听:
ss -tlnp | grep 7770

正常输出示例:

LISTEN 0 1 :::7770 :::* users:(("你的服务端二进制文件名",pid=xxx,fd=x))
  1. 可选优化:
    • 如果后续使用链路本地IPv6地址(fe80开头)通信,需要打开客户端代码中sin6_scope_id的注释,填入实际出口网卡的名称。
    • 将listen(fd, 1)中的backlog参数调整为10以上,避免短时间多个连接请求被直接丢弃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 03:57:01