void Proxy(TcpClient client, TcpClient proxy) { byte[] buffer = new byte[65536]; using (NetworkStream proxystream = proxy.GetStream()) { using (NetworkStream clientstream = client.GetStream()) { while (client.Connected && proxy.Connected) { bool available = false; if (proxystream.DataAvailable) { int read = proxystream.Read(buffer, 0, 65536); if (read > 0) { ProxyPacket packet = new ProxyPacket { EndPoint = proxy.Client.RemoteEndPoint, Data = buffer.Take(read).ToArray(), Source = proxy, Target = client }; OnPacketReceived(packet); if (packet.Forward && packet.Data.Length > 0) { clientstream.Write(packet.Data, 0, packet.Data.Length); } } available = true; } if (clientstream.DataAvailable) { int read = clientstream.Read(buffer, 0, 65536); if (read > 0) { ProxyPacket packet = new ProxyPacket { EndPoint = client.Client.RemoteEndPoint, Data = buffer.Take(read).ToArray(), Source = client, Target = proxy }; OnPacketReceived(packet); if (packet.Forward && packet.Data.Length > 0) { proxystream.Write(packet.Data, 0, packet.Data.Length); } } available = true; } if (!available) { Thread.Sleep(50); } } } } client.Close(); proxy.Close(); }
/// <summary> /// called when a packet was received by an endpoint /// </summary> /// <param name="packet">packet received</param> protected virtual void OnPacketReceived(ProxyPacket packet) { PacketReceived?.Invoke(packet); }