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自然会被拒绝。
解决方法
- 直接删除服务端
gw_server_socket_init函数中设置sin6_len的代码行:
// 删掉下面这行即可 serv_addr->sin6_len = sizeof(struct sockaddr_in6);
- 服务端启动后执行以下命令验证监听状态,确认7770端口正常在IPv6地址上监听:
ss -tlnp | grep 7770
正常输出示例:
LISTEN 0 1 :::7770 :::* users:(("你的服务端二进制文件名",pid=xxx,fd=x))
- 可选优化:
- 如果后续使用链路本地IPv6地址(fe80开头)通信,需要打开客户端代码中
sin6_scope_id的注释,填入实际出口网卡的名称。 - 将
listen(fd, 1)中的backlog参数调整为10以上,避免短时间多个连接请求被直接丢弃。
- 如果后续使用链路本地IPv6地址(fe80开头)通信,需要打开客户端代码中
内容的提问来源于stack exchange,提问作者guoyanzhang
相关产品推荐
相关产品推荐

