public static SocketPair GetPair(WebSocket webSocket) { foreach (var pair in SocketPairs) { if (!pair.IsFilled) { pair.Second = webSocket; return(pair); } } var socketPair = new SocketPair { First = webSocket }; SocketPairs.Add(socketPair); return(socketPair); }
public static async Task HandlePair(WebSocket webSocket, SocketPair socketPair) { while (true) { if (!socketPair.IsFilled) { Thread.Sleep(50); } else { break; } } if (webSocket == socketPair.First) { await webSocket.SendAsync(new ArraySegment <byte>(StartMessage1, 0, StartMessage1.Length), WebSocketMessageType.Text, true, CancellationToken.None); } else { await webSocket.SendAsync(new ArraySegment <byte>(StartMessage2, 0, StartMessage2.Length), WebSocketMessageType.Text, true, CancellationToken.None); } var counterPart = socketPair.GetCounterpart(webSocket); var buffer = new byte[1024 * 4]; var result = await counterPart.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { await webSocket.SendAsync(new ArraySegment <byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None); result = await counterPart.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } await counterPart.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }