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

调用Dns.GetHostAddresses获取IP后TcpClient无法连接IRC服务器问题

问题原因排查与解决方案
  • 端口监听配置错误:IRC SSL加密默认端口确实为6697,但需确认服务端的6697端口是绑定在公网IP上,而非仅绑定127.0.0.1本地回环地址。可在服务端执行命令排查:Windows系统用netstat -ano | findstr 6697,Linux系统用ss -tulnp | grep 6697,如果监听地址显示为127.0.0.1,外部设备将无法连接。
  • DNS解析优先级问题:Dns.GetHostAddresses会返回域名对应的所有IPv4、IPv6地址,如果你的服务端没有配置IPv6监听,代码会优先尝试连接IPv6地址,此时就会卡在SYN_SENT状态直到超时。可在代码中过滤地址类型,优先使用IPv4连接:
// 新增地址族过滤,仅保留IPv4地址
IPAddress[] hostEntry = Dns.GetHostAddresses(cnc)
                           .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)
                           .ToArray();
  • 连接超时逻辑缺失:你当前贴出的代码没有配置连接超时,TcpClient默认超时时间长达数十秒,如果第一个解析到的IP不可达,代码会长时间卡在连接阶段。可手动添加超时判断,避免单IP阻塞整个遍历逻辑:
using (var client = new TcpClient())
{
    // 配置3秒连接超时
    var connectTask = client.ConnectAsync(hostEntry[i].ToString(), 6697);
    if (await Task.WhenAny(connectTask, Task.Delay(3000)) != connectTask)
    {
        // 超时后跳过当前IP,尝试下一个解析结果
        continue;
    }
    // 正常连接后的读写逻辑
}
  • 客户端侧端口拦截:即使服务端关闭了防火墙,也要确认客户端本地防火墙、运营商/云服务商的安全策略是否封禁了6697端口的出站连接,多数民用运营商会默认拦截IRC常用端口的出站流量。可在客户端本地执行telnet 服务端IP 6697测试连通性,如果telnet也无法连接,即可判定为网络层面的端口拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 19:15:03