Skip to content

feat: 未完成帧超时 IncompleteFrameTimeoutMs - #41

Merged
CSJ608 merged 1 commit into
mainfrom
feat-incomplete-frame-timeout
Aug 28, 2026
Merged

CSJ608 merged 1 commit into
mainfrom
feat-incomplete-frame-timeout

Conversation

@CSJ608

@CSJ608 CSJ608 commented Aug 28, 2026

Copy link
Copy Markdown
Owner

Closes #38

语义

新增 StreamConnectionOptions.IncompleteFrameTimeoutMs(默认 0 = 关闭,纯增量):

  • 触发条件:缓冲里已有半帧字节(帧已开头),但连续 N ms 未收到后续字节 → 判定会话失效,走既有断线重连流程;
  • 不触发:缓冲为空的静默连接(哪怕从未收到字节)、整帧切尽后的长时间空闲;
  • 重置:每次收到新字节计时归零;
  • 上报:FrameError 新类别 IncompleteFrameTimeout,携带受 8KB 上限保护的缓冲快照(与 IncompleteFrameOverflow 快照同一上限常量)。

实现要点

  • 计时放在解码循环(半帧状态所在地),而非接收循环:每次 ReadAsync 前,仅当上轮 AdvanceTo 后缓冲非空且选项开启时,挂一个独立的超时令牌——令牌刻意不链会话取消(遵守 FrameDecoder 生命周期约定二),只有超时会触发它;超时后以 SessionFault 收尾、不再复用该 PipeReader,因此不存在"进行中的读取残留到下一次读取"(issue 特别强调的点)。
  • 数据与超时同时到达的窗口:ReadAsync 以 IsCanceled 结果返回时同样按超时处理(闩锁路径),OCE 路径与 IsCanceled 路径都有覆盖。
  • 与 ReceiveIdleTimeoutMs 完全独立、互不影响;MaxIncompleteFrameBufferBytes(字节防线)与它(时间防线)互补,README 已明确区分。

测试(真实 TCP 回环,9 用例 × net8.0/net10.0/net48 全过)

对应 issue 测试清单:从未收到字节不触发 / 只有部分长度头超时并结束会话 / 完整头半正文超时 / 期限内续传重置并最终交付 / 整帧后长空闲不触发 / 连续两轮超时重连幂等(迟到故障不误杀新会话)/ 快照 8KB 截断 / 超时重连中 Dispose 干净停机 / 负值构造即抛。

验收标准核对

  • 与 ReceiveIdleTimeoutMs 的区别在公共文档明确说明(XML 注释 + README 双语"未完成帧防护"与"活性探测"两节)
  • 默认配置完全向后兼容(默认 0,现有 55×3 用例不变全绿)
  • net8.0、net10.0、net48 测试矩阵全部通过(64×3 = 192)

- 新选项:帧已开头但后续字节连续 N ms 未到达即判定会话失效、断线重连;默认 0 = 关闭
- 计时在解码循环侧:仅当缓冲有未消费字节(半帧进行中)时给 ReadAsync 挂独立
  超时令牌(不链会话取消,遵守解码器生命周期约定);缓冲为空不计时、新字节
  到达即重置、整帧切尽归零——与 ReceiveIdleTimeoutMs(完全静默也计时)互补
- FrameError 新类别 IncompleteFrameTimeout,携带 8KB 上限保护的缓冲快照
- 测试:真实 TCP 回环 9 用例覆盖 issue 清单(静默不触发/半头超时/半正文超时/
  续传重置/整帧后空闲不触发/连续超时幂等/快照截断/构造校验/超时中 Dispose)
- README 双语区分两种接收超时的适用场景;CHANGELOG Unreleased 记录
@CSJ608
CSJ608 merged commit 9194674 into main Aug 28, 2026
4 checks passed
@CSJ608
CSJ608 deleted the feat-incomplete-frame-timeout branch August 28, 2026 08:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 增加未完成帧超时选项

1 participant