private void Send(Packet packet, bool client) { lock (client ? _clientLock : _serverLock) { bool success = PluginUtils.ProtectedInvoke(() => { MemoryStream ms = new MemoryStream(); using (PacketWriter w = new PacketWriter(ms)) { w.Write((int)0); w.Write(packet.Id); packet.Write(w); } byte[] data = ms.ToArray(); PacketWriter.BlockCopyInt32(data, data.Length); if (client) { _clientSendState.Cipher(data); _clientStream.Write(data, 0, data.Length); } else { _serverSendState.Cipher(data); _serverStream.Write(data, 0, data.Length); } }, "PacketSend (packet = " + packet?.Type + ")", typeof(IOException)); if (!success) { Dispose(); } } }
// Token: 0x06000231 RID: 561 RVA: 0x0000FC54 File Offset: 0x0000DE54 private void RemoteRead(IAsyncResult ar) { bool flag = (bool)ar.AsyncState; PacketBuffer packetBuffer = flag ? this._clientBuffer : this._serverBuffer; NetworkStream networkStream = flag ? this._clientStream : this._serverStream; bool flag2; RC4Cipher rc4Cipher = (flag2 = (networkStream == this._clientStream)) ? this._clientReceiveState : this._serverReceiveState; try { if (networkStream.CanRead) { int num = networkStream.EndRead(ar); packetBuffer.Advance(num); if (num == 0) { this.Dispose(null); } else if (packetBuffer.Index == 4) { packetBuffer.Resize(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(packetBuffer.Bytes, 0))); this.BeginRead(packetBuffer.Index, packetBuffer.BytesRemaining(), flag2); } else if (packetBuffer.BytesRemaining() > 0) { this.BeginRead(packetBuffer.Index, packetBuffer.BytesRemaining(), flag2); } else { rc4Cipher.Cipher(packetBuffer.Bytes); Packet packet = Packet.Create(packetBuffer.Bytes); object handleLock = this._handleLock; lock (handleLock) { this.HandlePacket(packet); } if (packet.Send) { this.Send(packet, !flag2); } packetBuffer.Reset(); this.BeginRead(0, 4, flag2); } } } catch (Exception reason) { this.Dispose(reason); } }
private void Send(Packet packet, bool client) { if (packet.Send == false && packet.Type != PacketType.HELLO) { return; } lock (client ? _clientLock : _serverLock) { bool success = false; try { MemoryStream ms = new MemoryStream(); using (PacketWriter w = new PacketWriter(ms)) { w.Write((int)0); w.Write(packet.Id); packet.Write(w); } byte[] data = ms.ToArray(); PacketWriter.BlockCopyInt32(data, data.Length); if (client) { _clientSendState.Cipher(data); _clientStream.Write(data, 0, data.Length); } else { _serverSendState.Cipher(data); _serverStream.Write(data, 0, data.Length); } success = true; } catch { } if (!success) { Dispose(); } } }
private void RemoteRead(IAsyncResult ar) { NetworkStream stream = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item1; PacketBuffer buffer = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item2; bool isClient = stream == _clientStream; RC4Cipher cipher = isClient ? _clientReceiveState : _serverReceiveState; bool success = PluginUtils.ProtectedInvoke(() => { if (!stream.CanRead) { return; } int read; try { read = stream.EndRead(ar); } catch { return; } buffer.Advance(read); if (read == 0) { Dispose(); return; } else if (buffer.Index == 4) { // We have the first four bytes, resize the client buffer buffer.Resize(IPAddress.NetworkToHostOrder( BitConverter.ToInt32(buffer.Bytes, 0))); BeginRead(buffer.Index, buffer.BytesRemaining(), isClient); } else if (buffer.BytesRemaining() > 0) { // Awaiting the rest of the packet BeginRead(buffer.Index, buffer.BytesRemaining(), isClient); } else { // We have the full packet cipher.Cipher(buffer.Bytes); byte[] temp = (byte[])buffer.Bytes.Clone(); if (_proxy.IsHooked((PacketType)buffer.Bytes[4])) { temp = null; //If a packet isn't hooked then just send the raw data (no packet processing). Helps with broken/missing packet types. } Packet packet = Packet.Create(buffer.Bytes); if (isClient) { _proxy.FireClientPacket(this, packet); } else { _proxy.FireServerPacket(this, packet); } if (packet.Send) { Send(packet, !isClient, temp); } buffer.Reset(); BeginRead(0, 4, isClient); } }, "RemoteRead (isClient = " + isClient + ")", typeof(IOException)); if (!success) { Dispose(); } }
private void RemoteRead(IAsyncResult ar) { NetworkStream stream = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item1; PacketBuffer buffer = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item2; bool isClient = stream == _clientStream; RC4Cipher cipher = isClient ? _clientReceiveState : _serverReceiveState; bool success = PluginUtils.ProtectedInvoke(() => { if (!stream.CanRead) { return; } int read; try { read = stream.EndRead(ar); } catch { return; } buffer.Advance(read); if (read == 0) { Dispose(); return; } else if (buffer.Index == 4) { // We have the first four bytes, resize the client buffer int len = IPAddress.NetworkToHostOrder( BitConverter.ToInt32(buffer.Bytes, 0)); if (len == 1014001516) //known issue { throw new Exception("Invalid Buffer Size Problem: Try joining a non-proxy server then switching to the proxy server again. More info: https://www.mpgh.net/forum/showthread.php?t=1196439"); } buffer.Resize(len); BeginRead(buffer.Index, buffer.BytesRemaining(), isClient); } else if (buffer.BytesRemaining() > 0) { // Awaiting the rest of the packet BeginRead(buffer.Index, buffer.BytesRemaining(), isClient); } else { // We have the full packet cipher.Cipher(buffer.Bytes); Packet packet = Packet.Create(buffer.Bytes); if (isClient) { _proxy.FireClientPacket(this, packet); } else { _proxy.FireServerPacket(this, packet); } if (packet.Send) { Send(packet, !isClient); } buffer.Reset(); BeginRead(0, 4, isClient); } }, "RemoteRead (isClient = " + isClient + ")", typeof(IOException)); if (!success) { Dispose(); } }
private void RemoteRead(IAsyncResult ar) { NetworkStream stream = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item1; PacketBuffer buffer = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item2; bool isClient = stream == _clientStream; RC4Cipher cipher = isClient ? _clientReceiveState : _serverReceiveState; bool success = PluginUtils.ProtectedInvoke(() => { if (!stream.CanRead) { return; } int read; try { read = stream.EndRead(ar); } catch { return; } buffer.Advance(read); if (read == 0) { Dispose(); return; } else if (buffer.Index == 4) { buffer.Resize(IPAddress.NetworkToHostOrder( BitConverter.ToInt32(buffer.Bytes, 0))); BeginRead(buffer.Index, buffer.BytesRemaining(), isClient); } else if (buffer.BytesRemaining() > 0) { BeginRead(buffer.Index, buffer.BytesRemaining(), isClient); } else { cipher.Cipher(buffer.Bytes); Packet packet = Packet.Create(buffer.Bytes); if (isClient) { _proxy.FireClientPacket(this, packet); } else { _proxy.FireServerPacket(this, packet); } if (packet.Send) { Send(packet, !isClient); } buffer.Reset(); BeginRead(0, 4, isClient); } }, "RemoteRead (isClient = " + isClient + ")", typeof(IOException)); if (!success) { Dispose(); } }