调用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
相关产品推荐
相关产品推荐

