// called from the tcp sniffer, so it needs to lock void HandleTcpDataReceived(TcpConnection connection, ArraySegment <byte> data) { lock (_eventLock) { if (data.Count == 0) { return; } if (_isNew.Contains(connection)) { if (_serversByIp.ContainsKey(connection.Source.Address.ToString()) && data.Array.Skip(data.Offset).Take(4).SequenceEqual(new byte[] { 1, 0, 0, 0 })) { _isNew.Remove(connection); var server = _serversByIp[connection.Source.Address.ToString()]; _serverToClient = connection; _clientToServer = null; _decrypter = new ConnectionDecrypter(server.Region); _decrypter.ClientToServerDecrypted += HandleClientToServerDecrypted; _decrypter.ServerToClientDecrypted += HandleServerToClientDecrypted; _messageSplitter = new MessageSplitter(); _messageSplitter.MessageReceived += HandleMessageReceived; OnNewConnection(server); } if (_serverToClient != null && _clientToServer == null && (_serverToClient.Destination.Equals(connection.Source) && _serverToClient.Source.Equals(connection.Destination))) { _isNew.Remove(connection); _clientToServer = connection; } } if (!(connection == _clientToServer || connection == _serverToClient)) { return; } if (_decrypter == null) { return; } var dataArray = data.Array.Skip(data.Offset).Take(data.Count).ToArray(); if (connection == _clientToServer) { _decrypter.ClientToServer(dataArray); } else { _decrypter.ServerToClient(dataArray); } } }
// called from the tcp sniffer, so it needs to lock void HandleTcpDataReceived(TcpConnection connection, ArraySegment<byte> data) { lock (_eventLock) { if (data.Count == 0) return; if (_isNew.Contains(connection)) { _isNew.Remove(connection); if (_serversByIp.ContainsKey(connection.Source.Address.ToString()) && data.Array.Skip(data.Offset).Take(4).SequenceEqual(new byte[] { 1, 0, 0, 0 })) { var server = _serversByIp[connection.Source.Address.ToString()]; _serverToClient = connection; _clientToServer = null; _decrypter = new ConnectionDecrypter(); _decrypter.ClientToServerDecrypted += HandleClientToServerDecrypted; _decrypter.ServerToClientDecrypted += HandleServerToClientDecrypted; _messageSplitter = new MessageSplitter(); _messageSplitter.MessageReceived += HandleMessageReceived; OnNewConnection(server); } if (_serverToClient != null && _clientToServer == null && (_serverToClient.Destination.Equals(connection.Source) && _serverToClient.Source.Equals(connection.Destination))) { _clientToServer = connection; } } if (!(connection == _clientToServer || connection == _serverToClient)) return; if (_decrypter == null) return; var dataArray = data.Array.Skip(data.Offset).Take(data.Count).ToArray(); if (connection == _clientToServer) _decrypter.ClientToServer(dataArray); else _decrypter.ServerToClient(dataArray); } }
// called from the tcp sniffer, so it needs to lock private void HandleTcpDataReceived(TcpConnection connection, byte[] data, int needToSkip) { { if (data.Length == 0) { if (needToSkip==0 || !(connection == _clientToServer || connection == _serverToClient)) return; if (_decrypter == null) return; if (connection == _clientToServer) _decrypter.Skip(MessageDirection.ClientToServer, needToSkip); else _decrypter.Skip(MessageDirection.ServerToClient, needToSkip); return; } if (_isNew.ContainsKey(connection)) { if (_serversByIp.ContainsKey(connection.Source.Address.ToString()) && data.Take(4).SequenceEqual(new byte[] {1, 0, 0, 0})) { byte q; _isNew.TryRemove(connection, out q); var server = _serversByIp[connection.Source.Address.ToString()]; _serverToClient = connection; _clientToServer = null; ServerProxyOverhead = (int) connection.BytesReceived; _decrypter = new ConnectionDecrypter(server.Region); _decrypter.ClientToServerDecrypted += HandleClientToServerDecrypted; _decrypter.ServerToClientDecrypted += HandleServerToClientDecrypted; _messageSplitter = new MessageSplitter(); _messageSplitter.MessageReceived += HandleMessageReceived; _messageSplitter.Resync += OnResync; OnNewConnection(server); } if (_serverToClient != null && _clientToServer == null && _serverToClient.Destination.Equals(connection.Source) && _serverToClient.Source.Equals(connection.Destination)) { ClientProxyOverhead=(int)connection.BytesReceived; byte q; _isNew.TryRemove(connection, out q); _clientToServer = connection; } if (connection.BytesReceived > 0x10000) //if received more bytes but still not recognized - not interesting. { byte q; _isNew.TryRemove(connection, out q); connection.DataReceived -= HandleTcpDataReceived; connection.RemoveCallback(); } } if (!(connection == _clientToServer || connection == _serverToClient)) return; if (_decrypter == null) return; if (connection == _clientToServer) _decrypter.ClientToServer(data, needToSkip); else _decrypter.ServerToClient(data, needToSkip); } }