// called from the tcp sniffer, so it needs to lock private 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 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; } 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; var server = _serversByIp[connection.Destination.Address.ToString()]; OnNewConnection(server); } 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); } } }