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

调试停止时服务器因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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:20