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

C# Socket编程遇System.Net.Sockets.SocketException(995)错误求助

解决.NET 6 Socket服务器System.Net.Sockets.SocketException(995)问题

核心排查与修复方案

1. 优先确认客户端连接行为

错误995本质是I/O操作被中止,大概率是客户端连接建立后立刻断开套接字,导致服务器ReadAsync触发异常:

  • 检查客户端代码:是否连接后未保持会话就直接退出,或未发送数据就断开连接。
  • 手动测试:用telnet或nc命令连接服务器,手动输入"Join"/"Create"指令,若操作正常,说明问题出在客户端逻辑。

2. 修正服务器连接处理逻辑

  • 避免任务被意外取消:检查AcceptAsync启动的处理任务是否被外部CancellationToken提前终止,同时确保服务器监听循环未意外退出。
  • 给ReadAsync添加针对性异常处理,防止单个连接异常导致整体服务崩溃,示例代码:
try
{
    int bytesRead = await networkStream.ReadAsync(buffer, 0, buffer.Length);
    if (bytesRead == 0)
    {
        // 客户端主动断开,清理资源
        networkStream.Dispose();
        socket.Dispose();
        return;
    }
    string receivedCmd = Encoding.UTF8.GetString(buffer, 0, bytesRead).Trim();
    if (receivedCmd.Equals("Join", StringComparison.OrdinalIgnoreCase) || 
        receivedCmd.Equals("Create", StringComparison.OrdinalIgnoreCase))
    {
        // 执行后续业务逻辑
    }
}
catch (SocketException ex) when (ex.ErrorCode == 995)
{
    // 记录日志并清理当前连接资源
    networkStream?.Dispose();
    socket?.Dispose();
}

3. 排查系统级网络资源问题

  • 重启服务器主机:系统网络栈句柄泄漏可能引发此类异常,重启可重置网络资源。
  • 检查资源释放逻辑:确保每个连接处理完成后,都调用Dispose()释放Socket和NetworkStream,避免资源耗尽导致新连接操作被中止。

4. 验证.NET 6运行环境

  • 更新.NET 6 runtime/SDK到最新补丁版本:部分旧版本运行时存在异步套接字操作bug,更新后可解决问题。
  • 确认程序运行权限:尝试以管理员身份启动服务器,低权限可能导致系统中止网络操作。

关键验证步骤

  1. 编写极简测试客户端:连接服务器后等待用户输入指令再发送,确认是否仍触发错误。
  2. 启用详细日志:记录每个连接的建立、读取操作状态,定位异常发生的具体时机。

内容的提问来源于stack exchange,提问作者Aung Kyaw Myo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:07:08