Example #1
0
 /**
  * Do async read on client
  * Added for debugging purposes
  * Doesn't do much yet
  */
 private void MonitorClient(TcpClient client)
 {
     try {
         byte[]          buffer = new byte[512];
         WsCallbackState state  = new WsCallbackState(client, buffer);
         client.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ClientDataCallback), state);
     } catch (Exception) {
     }
 }
Example #2
0
        /**
         * Async callback for data sent by client
         */
        private void ClientDataCallback(IAsyncResult state)
        {
            try {
                WsCallbackState cs     = (WsCallbackState)state.AsyncState;
                NetworkStream   stream = cs.client.GetStream();
                int             bytes  = stream.EndRead(state);
                if (bytes > 0)
                {
                    byte[] frames = new byte[bytes];
                    Array.Copy(cs.buffer, 0, frames, 0, bytes);
                    bool closed = false;
                    try {
                        // decode client message
                        WsDataFrame frame = FramesToMessage(frames);

                        if (frame.opcode == 0x8)   // close frame
                        {
                            int close_code = 0;
                            if (frame.payload.Length == 2)
                            {
                                close_code = ((frame.payload[0] & 0xff) << 8) + (frame.payload[1] & 0xff);
                            }
                            byte[] close_msg = WsDataFrame.CloseFrame(close_code);
                            stream.Write(close_msg, 0, close_msg.Length);
                            cs.client.Close();
                            _clients.Remove(cs.client);
                            closed = true;
                        }
                        else if (frame.opcode == 0x9)     // ping frame
                        {
                            byte[] pong_msg = WsDataFrame.PongFrame(frame.payload);
                            stream.Write(pong_msg, 0, pong_msg.Length);
                        }
                    } catch (WsFatalClientException ex) {
                        // client did something wrong. kill connection
                        if (_verbose > 0)
                        {
                            System.Console.WriteLine(ex);
                        }
                        cs.client.Close();
                        _clients.Remove(cs.client);
                        closed = true;
                    } catch (Exception ex) {
                        if (_verbose > 0)
                        {
                            System.Console.WriteLine(ex);
                        }
                    }

                    if (!closed)
                    {
                        MonitorClient(cs.client);
                    }
                }
                else     // zero-bytes read implies closed connection, I think
                {
                    cs.client.Close();
                    _clients.Remove(cs.client);
                }
            } catch (Exception) {
            }
        }