评审基线:StreamFrame 2.6.0,提交 4b892d9eaa11cf003b5d10793e735b0604bc17ed(2026-09-08 仓库评审)。
问题与影响
P1,已独立复现。 被动连接启动时端口被占用,之后占用方退出,StreamFrame 仍不能恢复监听,持续停留在 Connecting。
定位:src/StreamFrame/Connection/StreamConnection.cs:366,以及 src/StreamFrame/Connection/StreamConnection.cs:320。
InitServer() 先赋值 _server 再 Bind/Listen;Bind 抛异常后字段仍非空,后续 AcceptAsync 跳过 InitServer,在未绑定/未监听的 Socket 上不断失败。相关历史问题 #47 已关闭;本 Issue 跟踪当前提交仍存在的“第一次绑定失败后资源未回滚”路径,不能仅以原竞速测试通过判定已修复。
复现
Windows、.NET 8.0.30:
- 用 TcpListener 独占一个回环端口(
ExclusiveAddressUse = true),保持监听。
- 同端口启动被动 StreamConnection,设置
AcceptRetryDelayMs = 50。
- 确认第一次绑定失败;评审探针等待约 250ms 后停止占用端口的 TcpListener。
- 再等待重试,用新 TcpClient 尝试连接。
- 观察连接状态,并检查保留的
_server.IsBound。
评审实测:
bind-recovery: OperationCanceledException; state=Connecting
bind-recovery: retained socket bound=False
探针客户端设置了 1500ms 取消预算。预期:端口释放后,在正常重试预算内自动完成 Bind/Listen/Accept 并收发消息。
建议与验收
实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。
评审基线:StreamFrame 2.6.0,提交
4b892d9eaa11cf003b5d10793e735b0604bc17ed(2026-09-08 仓库评审)。问题与影响
P1,已独立复现。 被动连接启动时端口被占用,之后占用方退出,StreamFrame 仍不能恢复监听,持续停留在 Connecting。
定位:src/StreamFrame/Connection/StreamConnection.cs:366,以及 src/StreamFrame/Connection/StreamConnection.cs:320。
InitServer()先赋值_server再 Bind/Listen;Bind 抛异常后字段仍非空,后续 AcceptAsync 跳过 InitServer,在未绑定/未监听的 Socket 上不断失败。相关历史问题 #47 已关闭;本 Issue 跟踪当前提交仍存在的“第一次绑定失败后资源未回滚”路径,不能仅以原竞速测试通过判定已修复。复现
Windows、.NET 8.0.30:
ExclusiveAddressUse = true),保持监听。AcceptRetryDelayMs = 50。_server.IsBound。评审实测:
探针客户端设置了 1500ms 取消预算。预期:端口释放后,在正常重试预算内自动完成 Bind/Listen/Accept 并收发消息。
建议与验收
实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。