调试停止时服务器因SocketException崩溃,求助解决远程连接关闭问题
解决Socket调试停止时抛出SocketException的问题
你的问题很典型——当调试停止时客户端连接被强制关闭,而你的代码里没有对Socket.Receive()可能抛出的异常做任何处理,导致程序直接崩溃。
问题根源
clientSocket.Receive()在远程连接意外关闭(比如你停止调试时客户端断开)时,会抛出System.Net.Sockets.SocketException(错误码通常为10054:远程主机强迫关闭了一个现有的连接)。你的while(true)循环里完全没有异常捕获逻辑,所以这个未处理的异常会直接终止程序。
修复方案
我们需要给接收逻辑加上异常捕获,区分连接正常关闭和其他错误的情况,同时在异常发生后优雅地释放Socket资源:
public static void Data_IN(object cSocket) { Socket clientSocket = (Socket)cSocket; byte[] Buffer; int readBytes; try { while (true) { Buffer = new byte[clientSocket.SendBufferSize]; readBytes = clientSocket.Receive(Buffer); if (readBytes > 0) { Packet p = new Packet(Buffer); DataManager(p); } // 如果readBytes为0,说明远程正常关闭连接 else if (readBytes == 0) { break; } } } catch (SocketException ex) { // 处理连接断开的情况,比如10054是常见的远程强制关闭 if (ex.ErrorCode == 10054) { Console.WriteLine("客户端连接已断开"); } else { // 处理其他Socket错误 Console.WriteLine($"Socket错误: {ex.Message}"); } } catch (ObjectDisposedException) { // 处理Socket已被释放的情况 Console.WriteLine("Socket已被释放"); } finally { // 无论是否异常,都要确保Socket被正确释放 if (clientSocket != null && clientSocket.Connected) { clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } } }
关键说明
try-catch-finally块:确保异常被捕获,并且Socket资源最终会被释放,避免资源泄漏。readBytes == 0的判断:当远程正常关闭连接时,Receive()会返回0,这时候我们可以主动退出循环。- 区分SocketException错误码:只针对连接断开的情况做友好处理,其他错误可以记录日志方便排查。
这样修改后,当你停止调试时,服务器会捕获到连接断开的异常,优雅地关闭Socket并退出接收线程,而不会崩溃。
内容的提问来源于stack exchange,提问作者Fuppetia
相关产品推荐
相关产品推荐

