Skip to content

bug: [P1] 修正现代 .NET TCP KeepAlive 配置的毫秒/秒单位错配 #62

Closed

Description

@CSJ608

评审基线: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;选项定义:src/StreamFrame/StreamConnectionOptions.cs:67。
单位依据:Microsoft SocketOptionName 文档。

复现步骤与实测

Windows、.NET 8.0.30,使用当前仓库构建:

  1. 创建被动 StreamConnection,options 设置 TcpKeepAlive = true,其余 KeepAlive 选项默认。
  2. 用本地 TcpClient 连接,等待 WaitForConnectedAsync() 完成。
  3. 在测试中读取已连接 Socket(可通过现有测试缝隙或反射字段 _socket)。
  4. 调用 GetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveTime) 及 Interval。

实测输出:

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

  1. CSJ608 commented on Sep 8, 2026

    @CSJ608
    OwnerAuthor

    维护者决议(2026-09-08)

    维护者在协调任务中确认:“#62 向上取整我觉得可以”。

    • 现代 .NET 的 KeepAlive 毫秒配置向上取整为整秒:1ms → 1s,1500ms → 2s;默认 30000ms / 5000ms → 30s / 5s。
    • 保留正数校验;换算应避免整数溢出,不得得到 0 秒。
    • netstandard2.0 的 IOControl 分支保留毫秒语义,不套用秒转换。
    • 文档说明平台粒度差异,按原 Issue 验收操作系统实际配置值、默认值与边界,并完成跨框架回归。

    这是实施依据,尚不代表修复已完成。继续按 AGENTS.md 走分支、测试、CHANGELOG 和 PR 流程。

  2. CSJ608 commented on Sep 8, 2026

    @CSJ608
    OwnerAuthor

    已通过 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通过;未修改该测试或声称解决其根因,已回报协调任务。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions