public async Task TestServer_Client_External_NetworkCableDisconnect() { //arrange var server = new WebListenerWebSocketServer(); var port = 8883;//_FreeTcpPort(); Stopwatch sw = null; bool disconnected = false; Guid connid = Guid.Empty; TaskCompletionSource <bool> connectionEstablished = new TaskCompletionSource <bool>(); TaskCompletionSource <bool> disconnectedTCS = new TaskCompletionSource <bool>(); var beh = new testBeh() { ClosedHandler = (e) => { if (connid == e.ConnectionId) { disconnectedTCS.TrySetResult(true); disconnected = true; } }, ConnectionEstablished = (cid, ctx) => { Console.WriteLine("Connected"); connid = cid; connectionEstablished.TrySetResult(true); } }; beh.StringMessageHandler = (e) => { e.WebSocket.SendStringAsync(e.Data + e.Data, CancellationToken.None); }; var u = $"://+:{port}/"; server.AddRouteBehavior("/aaa", () => beh); await server.StartAsync("http" + u); await connectionEstablished.Task; await Task.Delay(1000);//wait a sec send data var times = 0; while (times < 1000 || !disconnected) { try { await server.SendBytesAsync(connid, Encoding.UTF8.GetBytes($"ServerTime: {DateTime.Now.ToLongTimeString()}")); } catch { break; } await Task.Delay(100); times++; } sw = Stopwatch.StartNew(); await Task.WhenAny(Task.Delay(TimeSpan.FromMinutes(6)), disconnectedTCS.Task); var time = sw.Elapsed; Assert.True(disconnected); server.Dispose(); }