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

C#如何检测Socket与服务器的活跃连接?现有方法异常排查

问题原因分析

你的IsConnected方法在Socket未连接时返回错误结果,主要是这几个原因导致的:

  • 缺少基础连接状态校验:当Socket还没调用Connect(或者Connect失败、尚未完成)时,socket.Connected本身就是false,但你的方法直接跳过这个判断,用Poll和Available来检测——而Poll的返回值对于未连接的Socket没有参考意义,自然会给出错误结果。
  • Poll方法的适用场景限制:Poll(1, SelectMode.SelectRead)是用来检测已连接Socket是否有可读数据,或是连接是否被对方主动关闭的。对于还没建立连接的Socket,这个调用的返回结果完全不可靠,比如刚创建的Socket调用Poll可能返回false,你的方法就会错误地返回true,但实际上Socket根本没和服务器建立连接。
修复后的方法

我给你调整了方法逻辑,先做基础状态校验,再结合Poll和Available检测已连接后的断开情况,这样就能覆盖“未连接”“连接已断开”等所有场景:

private static bool IsConnected(Socket socket)
{
    // 先判断Socket是否为空、已释放,或是从未建立过连接
    if (socket == null || !socket.Connected)
    {
        return false;
    }

    // 检测已连接的Socket是否被对方主动关闭
    bool isConnectionClosed = socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0;
    return !isConnectionClosed;
}
额外注意事项

即使修复后,这个方法也不是100%完美的:因为TCP连接本身是“无状态”的,如果对方异常断开(比如突然断电、网络中断),没有发送FIN包,那么Poll和Connected都无法立刻检测到断开。这种情况下,你需要通过定期发送心跳包的方式主动验证连接状态,这才是最可靠的长连接检测方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:27:09