private void Relay(NetworkStream ns, string rawRelayString) { string relayString = rawRelayString.Substring(6, rawRelayString.Length - 6); relayString = relayString.Replace("%20", " "); WowAutomater.SetRelayString(relayString); string contentString = "Sent: " + relayString; string responseString = "HTTP/1.1 200 OK\r\n"; responseString += "Content-Length: " + contentString.Length.ToString() + "\r\n"; responseString += "Content-Type: text/html\r\n"; responseString += "Connection: Closed\r\n\r\n"; responseString += contentString; ns.Write(ASCIIEncoding.ASCII.GetBytes(responseString), 0, responseString.Length); }
private void ConnectToRemote(string host, string user) { byte[] loginBytes = new byte[LOGIN_LENGTH]; loginBytes[0] = LOGIN_BYTE_1; loginBytes[1] = LOGIN_BYTE_2; Array.Copy(ASCIIEncoding.ASCII.GetBytes(user), 0, loginBytes, 2, user.Length); try { using (TcpClient tcpClient = new TcpClient(host, PORT)) { tcpClient.NoDelay = true; using (NetworkStream ns = tcpClient.GetStream()) { ns.Write(loginBytes, 0, loginBytes.Length); byte[] dataBuffer = new byte[READ_BUFFER_LENGTH]; while (true) { while (tcpClient.Available == 0 && !m_StopRemote && tcpClient.Connected) { if (tcpClient.Client.Poll(0, SelectMode.SelectRead)) { byte[] buff = new byte[1]; if (tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0) { m_StopRemote = true; } } System.Threading.Thread.Sleep(10); } if (m_StopRemote || !tcpClient.Connected) { break; } byte command = (byte)ns.ReadByte(); switch (command) { case BAD_LOGIN_BYTE: { throw new Exception("User not found"); } case LOGIN_BYTE: { ns.WriteByte(LOGIN_BYTE); SetRemoteWebInterfaceButtonStyle(true); break; } case START_BYTE: { ns.WriteByte(START_BYTE); WowAutomater.RemoteStart(); break; } case STOP_BYTE: { ns.WriteByte(STOP_BYTE); WowAutomater.RemoteStop(); break; } case SCREEN_BYTE: { ns.WriteByte(SCREEN_BYTE); ns.ReadByte(); byte[] jpegBytes = GetScreenJpegBytes(); int jpegSize = jpegBytes.Length; byte[] sizeBytes = BitConverter.GetBytes(jpegSize); ns.Write(sizeBytes, 0, sizeBytes.Length); ns.ReadByte(); ns.Write(jpegBytes, 0, jpegBytes.Length); break; } case RELAY_BYTE: { ns.WriteByte(RELAY_BYTE); int bread = ns.Read(dataBuffer, 0, dataBuffer.Length); byte[] dataRead = new byte[bread]; Array.Copy(dataBuffer, dataRead, bread); string relayString = ASCIIEncoding.ASCII.GetString(dataRead); WowAutomater.SetRelayString(relayString); break; } default: { throw new Exception("BAD COMMAND"); } } } } } } catch (Exception err) { SetRemoteWebInterfaceButtonStyle(false); m_RemoteConnected = false; MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } remotewait.Set(); }