跨平台C# Socket服务端Windows正常 Mac下NodeJS客户端无法连接求助
核心问题原因
- 地址族不匹配是最高概率诱因:
Dns.GetHostEntry("localhost")在macOS环境下返回的地址列表首位默认是IPv6回环地址::1,而非Windows环境下优先返回的IPv4地址127.0.0.1。你的服务端实际只绑定了IPv6协议的11111端口,NodeJS客户端默认用IPv4请求127.0.0.1:11111自然会收到连接拒绝报错。你自行编写的C#测试客户端默认适配了IPv6地址,所以可以正常连接。 - 次要可能诱因:macOS防火墙限制了NodeJS进程的本地网络权限,或端口被其他进程占用。
排查解决步骤
- 修复服务端绑定逻辑(最高优先级)
不要直接取AddressList的第一个值,显式指定绑定的地址族,避免跨平台差异:
如果仅需要本地回环访问,直接显式绑定IPv4地址:
// 替换原有Dns.GetHostEntry相关逻辑 IPAddress ipAddr = IPAddress.Parse("127.0.0.1"); IPEndPoint LocalEndPoint = new(ipAddr, 11111); Socket listener = new(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
如果需要同时支持IPv4和IPv6访问,开启双栈绑定:
Socket listener = new(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); // 关闭IPv6仅用限制,同时支持IPv4和IPv6连接 listener.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); listener.Bind(new IPEndPoint(IPAddress.IPv6Any, 11111));
- 验证端口监听状态
在macOS启动服务端后,执行终端命令lsof -i :11111,查看端口实际绑定的地址是127.0.0.1还是::1,确认监听配置生效。 - 对齐客户端连接逻辑
如果服务端保留绑定IPv6地址,NodeJS客户端可以改为连接::1,或在connect时指定IPv6协议族:
socket.connect({port: 11111, host: 'localhost', family: 6});
- 检查系统配置
确认macOS「系统设置-网络-防火墙」没有限制11111端口的本地通信,确认NodeJS进程有本地网络访问权限。
补充:你当前贴出的服务端代码存在逻辑错误:内层循环中
serverSocket.Disconnect(true)后又调用serverSocket.listener.Accept()属于冗余逻辑,会导致连接处理异常,修复连接问题后建议同步修正业务逻辑。
内容的提问来源于stack exchange,提问作者Kim Sandberg
相关产品推荐
相关产品推荐

