Skip to content

bug: [P1] 首次 Bind 失败后残留无效监听 Socket,端口释放后仍无法自动恢复 #63

Description

@CSJ608

评审基线: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:

  1. 用 TcpListener 独占一个回环端口(ExclusiveAddressUse = true),保持监听。
  2. 同端口启动被动 StreamConnection,设置 AcceptRetryDelayMs = 50。
  3. 确认第一次绑定失败;评审探针等待约 250ms 后停止占用端口的 TcpListener。
  4. 再等待重试,用新 TcpClient 尝试连接。
  5. 观察连接状态,并检查保留的 _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 仅登记工作,不代表已实施修复。

Activity

  1. CSJ608 commented on Sep 8, 2026

    @CSJ608
    OwnerAuthor

    已由 PR #73 修复并 rebase 合并至 d738104f94bf52113d731621f8bdb6b4f65543cb。

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