IPv6客户端连接IPv6服务器报错无法分配请求地址,是否因无IPv6地址导致?
问题原因
你判断的完全正确,环境无可用IPv6地址就是报错的直接诱因。
你使用的代码是纯IPv6实现:
- 客户端硬编码连接IPv6环回地址
::1 - 服务端和客户端都用
AF_INET6协议族创建套接字
你当前的Ubuntu Docker环境未启用IPv6支持,系统无法分配IPv6地址发起连接,就会抛出connect(): Cannot assign requested address错误。
解决方案
方案1:启用Docker IPv6支持(无需改代码)
- 打开Docker配置:OSX上直接打开Docker Desktop,进入「Settings」-「Docker Engine」配置页
- 添加以下配置项:
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
- 保存配置后重启Docker,重新创建Ubuntu容器,此时运行
ip a就能看到::1环回地址,再运行服务端和客户端即可正常交互。
方案2:修改代码适配IPv4(无需改Docker配置)
服务端(server.c)修改点:
- 所有
sockaddr_in6替换为sockaddr_in,AF_INET6替换为AF_INET server_addr.sin6_addr = in6addr_any改为server_addr.sin_addr.s_addr = htonl(INADDR_ANY)- 地址字段
sin6_addr改为sin_addr,端口字段sin6_port改为sin_port INET6_ADDRSTRLEN替换为INET_ADDRSTRLEN
客户端(client.c)修改点:
- 所有
sockaddr_in6替换为sockaddr_in,AF_INET6替换为AF_INET inet_pton(AF_INET6, "::1", &server_addr.sin6_addr)改为inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr)- 端口字段
sin6_port改为sin_port
修改完成后重新编译运行,即可正常输出Received b from server。
内容的提问来源于stack exchange,提问作者the_prole
相关产品推荐
相关产品推荐

