/** * 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) { } }
/** * 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) { } }