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,更新后可解决问题。
- 确认程序运行权限:尝试以管理员身份启动服务器,低权限可能导致系统中止网络操作。
关键验证步骤
- 编写极简测试客户端:连接服务器后等待用户输入指令再发送,确认是否仍触发错误。
- 启用详细日志:记录每个连接的建立、读取操作状态,定位异常发生的具体时机。
内容的提问来源于stack exchange,提问作者Aung Kyaw Myo
相关产品推荐
相关产品推荐

