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

跨平台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进程的本地网络权限,或端口被其他进程占用。

排查解决步骤

  1. 修复服务端绑定逻辑(最高优先级)
    不要直接取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));
  1. 验证端口监听状态
    在macOS启动服务端后,执行终端命令lsof -i :11111,查看端口实际绑定的地址是127.0.0.1还是::1,确认监听配置生效。
  2. 对齐客户端连接逻辑
    如果服务端保留绑定IPv6地址,NodeJS客户端可以改为连接::1,或在connect时指定IPv6协议族:
socket.connect({port: 11111, host: 'localhost', family: 6});
  1. 检查系统配置
    确认macOS「系统设置-网络-防火墙」没有限制11111端口的本地通信,确认NodeJS进程有本地网络访问权限。

补充:你当前贴出的服务端代码存在逻辑错误:内层循环中serverSocket.Disconnect(true)后又调用serverSocket.listener.Accept()属于冗余逻辑,会导致连接处理异常,修复连接问题后建议同步修正业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:15:03