private void DataIn(IAsyncResult ar) { if (Source == null || Destination == null) { return; } int Readed = 0; Connection From = (Connection)ar.AsyncState; Connection To = From.Other; try { Readed = From.NS.EndRead(ar); } catch { ForwarderEvent?.Invoke(this, From == Source ? ForwarderEventType.ClientGone : ForwarderEventType.ServerGone); } if (Readed > 0) { From.BytesReceived += (ulong)Readed; DataTransmitted?.Invoke(this, Readed); /*Only enable if the connections behave weirdly. Causes massive performance issues. #if DEBUG * lock ("console") * { * Console.ForegroundColor = From == Source ? ConsoleColor.Green : ConsoleColor.Yellow; * Console.Error.WriteLine(b2s(From.Data, Readed)); * Console.ResetColor(); * } #endif * //*/ try { To.NS.Write(From.Data, 0, Readed); From.Handle = From.NS.BeginRead(From.Data, 0, BUFFER, DataIn, From); } catch { ForwarderEvent?.Invoke(this, To == Source ? ForwarderEventType.ClientGone : ForwarderEventType.ServerGone); } } else { ForwarderEvent?.Invoke(this, From == Source ? ForwarderEventType.ClientGone : ForwarderEventType.ServerGone); } }
protected void TransmitCallback(DataChunk dataChunk) { DataTransmitted?.Invoke(this, new EventArgs <DataChunk>(dataChunk)); }