예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
        /// <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;
            }
        }