public GameClientDataHandler(UInt32 id, Socket clientSocket, Socket serverSocket) { this.id = id; this.clientSocket = clientSocket; this.serverSocket = serverSocket; serverParseState = ServerParseState.Idle; }
public SocketDataHandler DataFromClient(Socket socket, Byte[] data, UInt32 length) { if (length == 0) { String rest = clientLineParser.Flush(); if (printTraffic) { if (rest != null) { Console.WriteLine("[CLIENT {0}] {1}", id, rest); } } if (printTraffic) { Console.WriteLine("[CLIENT {0}] [Closed]", id); } if (serverSocket.Connected) { serverSocket.Shutdown(SocketShutdown.Both); } return(null); } serverSocket.Send(data, 0, (Int32)length, SocketFlags.None); clientLineParser.Add(data, 0, length); String line; while (true) { line = clientLineParser.GetLine(); if (line == null) { break; } if (printTraffic) { Console.WriteLine("[CLIENT {0}] {1}", id, line); } // Search for 'action=start_rob_house' if (serverParseState == ServerParseState.Idle) { if (line.Contains(RobAction)) { Int32 encryptionKeyIndex = line.IndexOf(MapEncryption); if (encryptionKeyIndex < 0) { throw new FormatException(String.Format("Client Request had '{0}' but not '{1}'", RobAction, MapEncryption)); } nextMapEncryptionKey = new Byte[40]; Encoding.ASCII.GetBytes(line, (Int32)(encryptionKeyIndex + MapEncryption.Length), 40, nextMapEncryptionKey, 0); /* * Console.Write("[INFO] Rob House key= (Byte array of characters) '"); * for (int i = 0; i < nextMapEncryptionKey.Length; i++) * { * Console.Write((Char)nextMapEncryptionKey[i]); * } * Console.WriteLine("'"); */ serverParseState = ServerParseState.BlankLine; } } } return(DataFromClient); }
public SocketDataHandler DataFromServer(Socket socket, Byte[] data, UInt32 length) { if (length == 0) { String rest = serverLineParser.Flush(); if (printTraffic) { if (rest != null) { Console.WriteLine("[SERVER {0}] {1}", id, rest); } } if (printTraffic) { Console.WriteLine("[SERVER {0}] [Closed]", id); } if (clientSocket.Connected) { clientSocket.Shutdown(SocketShutdown.Both); } return(null); } clientSocket.Send(data, 0, (Int32)length, SocketFlags.None); serverLineParser.Add(data, 0, length); String line; while (true) { line = serverLineParser.GetLine(); if (line == null) { break; } if (printTraffic) { Console.WriteLine("[SERVER {0}] {1}", id, line); } // // Check for encrypted map // if (serverParseState > ServerParseState.Idle) { if (serverParseState == ServerParseState.BlankLine) { if (line.Length <= 0) { serverParseState++; } } else if (serverParseState == ServerParseState.Owner) { serverParseState++; } else if (serverParseState == ServerParseState.Map) { HouseViewerForm.HandleEncryptedMap(nextMapEncryptionKey, Convert.FromBase64String(line)); nextMapEncryptionKey = null; serverParseState = ServerParseState.Idle; } else { throw new InvalidOperationException(String.Format("Invalid server parse state '{0}'", serverParseState)); } } } return(DataFromServer); }