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

Socket.Connect报System.Net.SocketException(0x80004005)未知主机错误

问题根因排查

报错栈明确指向Dns.GetHostEntry()调用失败,和当前测试PC多网卡配置直接相关,核心问题点如下:

  • 无意义的DNS解析调用:代码中传入的是IP地址字符串,完全不需要调用Dns.GetHostEntry()做域名解析,该方法哪怕传入IP参数,也会触发系统反向PTR解析请求。当多网卡存在时,系统默认路由、DNS服务器配置指向了非目标网段的网卡,解析请求发出去后收不到响应,直接抛出Unknown host异常,拔掉非目标网卡后只有一条可用路由,解析请求能正常发送,因此连接恢复。
  • 代码冗余逻辑错误:你创建了SocketAsyncEventArgs对象配置了异步参数,但最终调用的是同步的Connect()方法,前面的异步配置完全无效,还额外引入了DNS解析的风险点。
  • 多网卡路由优先级问题:当前测试PC两张网卡的路由度量值配置有误,非目标网段的网卡优先级更高,系统默认把DNS解析请求、TCP连接请求优先发到错误网卡,导致请求失败。
修复方案
  1. 删掉多余的DNS解析逻辑,IP地址直接转IPAddress对象即可,不需要走Dns类:
    将原有代码行
telnetSocketAsyncEventArgs.RemoteEndPoint = new IPEndPoint(Dns.GetHostEntry(IPAddress.Trim()).AddressList[0].MapToIPv4(), port);

替换为

telnetSocketAsyncEventArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(IPAddress.Trim()), port);

如果需要兼容域名/IP两种输入,可以加判断:输入为合法IP直接Parse,否则再走Dns.GetHostEntry逻辑。
2. 保留多网卡环境的话,手动修改系统路由表,指定目标工业设备的IP段走对应网卡的网关:
打开管理员权限的cmd,执行命令:
route add 目标设备IP段 mask 子网掩码 对应网卡的网关 -p
例如目标设备属于192.168.2.0段,对应网卡网关为192.168.2.1,就执行route add 192.168.2.0 mask 255.255.255.0 192.168.2.1 -p,-p参数代表永久生效,重启系统不丢失配置。
3. 如果你需要使用异步连接逻辑,就把同步的Connect()调用替换为ConnectAsync(),否则可以直接删掉所有SocketAsyncEventArgs相关的无效代码。

验证步骤
  • 先注释所有SocketAsyncEventArgs相关代码,直接用IPAddress.Parse转换IP后调用Connect,确认是否能正常连接。
  • 如果仍然连接失败,在cmd中执行tracert 目标IP,查看路由跳转是否走了正确的网卡,若走错误网卡按上述路由表修改方法调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:36:06