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

