6218512365
v2-ci / build (push) Failing after 46s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped
Live verification on a Windows VM surfaced a crash loop: TcpFrameServer.EnsureListening assigned _listener = new TcpListener(...) BEFORE calling Start(). When Start() throws — e.g. the port is in a Windows excluded/reserved range (WSAEACCES) or already in use — the field was left non-null-but-unstarted, so the `if (_listener is not null) return` guard permanently skipped re-Start() and every subsequent AcceptTcpClientAsync() threw the misleading InvalidOperationException "Not listening" → 20 failures → exit 2 → NSSM restart → loop. Now _listener is assigned only after Start() succeeds, so a transient bind failure is retried and a permanent one surfaces the real bind error each iteration. Adds a regression test that forces a bind conflict and asserts the SocketException persists.