评审基线:StreamFrame 2.6.0,提交 `4b892d9eaa11cf003b5d10793e735b0604bc17ed`(2026-09-08 仓库评审)。 ## 问题与影响 **P1,已独立复现。** `KeepAliveTimeMs` / `KeepAliveIntervalMs` 是毫秒配置,但现代 .NET 分支将原值传给以秒为单位的 `TcpKeepAliveTime` / `TcpKeepAliveInterval`。默认开启 KeepAlive 后,预期 30 秒 / 5 秒实际变成 30000 秒 / 5000 秒,半开连接检测明显晚于文档预期。netstandard2.0 的 SIO_KEEPALIVE_VALS 分支使用毫秒,不能套用同一转换。 位置:[src/StreamFrame/Connection/StreamConnection.cs:412](https://github.com/CSJ608/StreamFrame/blob/4b892d9eaa11cf003b5d10793e735b0604bc17ed/src/StreamFrame/Connection/StreamConnection.cs#L412);选项定义:[src/StreamFrame/StreamConnectionOptions.cs:67](https://github.com/CSJ608/StreamFrame/blob/4b892d9eaa11cf003b5d10793e735b0604bc17ed/src/StreamFrame/StreamConnectionOptions.cs#L67)。 单位依据:[Microsoft SocketOptionName 文档](https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socketoptionname?view=net-10.0)。 ## 复现步骤与实测 Windows、.NET 8.0.30,使用当前仓库构建: 1. 创建被动 StreamConnection,options 设置 `TcpKeepAlive = true`,其余 KeepAlive 选项默认。 2. 用本地 TcpClient 连接,等待 `WaitForConnectedAsync()` 完成。 3. 在测试中读取已连接 Socket(可通过现有测试缝隙或反射字段 `_socket`)。 4. 调用 `GetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveTime)` 及 Interval。 实测输出: ```text configured=30000ms/5000ms; OS seconds=30000/5000 ``` 预期 OS 读回秒数为 30 / 5,而不是配置原值。 ## 建议与验收 - [ ] 现代 .NET 分支正确转换毫秒到秒;明确不足一秒、非整秒配置的取整/校验策略,避免变成无效的 0 秒。 - [ ] 保留 netstandard2.0 IOControl 分支的毫秒语义。 - [ ] 回归测试验证操作系统实际 Socket 配置值,至少覆盖默认值与非整秒边界。 - [ ] net8/net10 在支持的平台验证;net48 兼容测试通过。 - [ ] 文档明确粒度差异,CHANGELOG 记录修复。 实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。
Activity
CSJ608 commentedon Sep 8, 2026
维护者决议(2026-09-08)
维护者在协调任务中确认:“#62 向上取整我觉得可以”。
这是实施依据,尚不代表修复已完成。继续按 AGENTS.md 走分支、测试、CHANGELOG 和 PR 流程。
CSJ608 commentedon Sep 8, 2026
已通过 PR #76 按 rebase 合并,提交
84766af6ed0ad63e0a3995db020d005631661bc0。现代 .NET 正毫秒安全向上取整为秒,默认30/5秒;netstandard2.0 IOControl仍传毫秒,默认关闭和正数校验保留。真实Socket读回测试覆盖默认、非整秒、不足一秒及关闭状态,最大int换算边界通过;双语README和CHANGELOG已更新。
本机Release build零警告,最终全量测试net8/net10各129、net48共121项通过。PR CI及合并后main CI全部通过(Ubuntu net8/net10、Windows net48、AOT),合并后代码扫描通过,实施分支已删除。
另保留观察:本地既有net48重连竞速测试曾两次状态断言失败,最终全量及两轮CI通过;未修改该测试或声称解决其根因,已回报协调任务。