private void TransciverOnRecived(Tcp.Connection connection, Transciver transciver, TcRxArgs args) { BaseConnection.Statistic.IsResponsive = true; _heartbeatTimer.Stop(); if (BaseConnection.IsOpened) _heartbeatTimer.Start(); }
internal void Handle(TcRxArgs args) { if (IsDisposed) throw new InvalidOperationException("Auf das verworfene Objekt kann nicht zugegriffen werden."); if (_cRx != null) _rxTimeout.Stop(); List<byte> extendedData; int extensionlength = 0; if (_cRx != null && _cRx.DataBytes.Count != 0) { if (_cRx.DataBytes.Count >= PacketPrefix.Length-1) { extendedData = _cRx.DataBytes.GetRange(_cRx.DataBytes.Count - 1 - PacketPrefix.Length - 1, PacketPrefix.Length - 1); } else { extendedData = _cRx.DataBytes.GetRange(0, _cRx.DataBytes.Count); } extensionlength = extendedData.Count; extendedData.AddRange(args.Data); } else { extendedData = new List<byte>(args.Data); } byte[] data = extendedData.ToArray(); for (int i = 0; i < extendedData.Count; i++) { PacketPrefix prefix = PacketPrefix.FromBytes(data, i); PacketSuffix suffix = PacketSuffix.FromBytes(data, i); if (prefix != null) { FlushBytesToRx(); BeginRx(prefix); i = i + PacketPrefix.Length - 1; } else if (suffix != null) { FlushBytesToRx(); EndRx(suffix); i = i + PacketSuffix.Length - 1; } else if ( i >= extensionlength && _cRx != null) { _rxTempBytes.Add(data[i]); } } FlushBytesToRx(); if (_cRx != null) _rxTimeout.Start(); }
private void ApplyReciver() { if (_tcpcon.Connected == false) return; _stream = _tcpcon.GetStream(); ConfigureTcpConnection(); if (_tcpcon.Connected) Base.State = Tcp.Connection.States.Connected; Task t = new Task(() => { int bufLength = Base.Options.TranciverOptions.TransciverBufferLength; byte[] dataBuffer = new byte[bufLength]; Base.Log(this, "Reciving"); while (Base.IsOpened == true) { int datalength = _stream.Read(dataBuffer, 0, bufLength); DateTime reciveTime = DateTime.Now; if (datalength == 0) Close(); Base.Statistic.RxDataLength = Base.Statistic.RxDataLength + datalength; Base.Statistic.LastRecived = DateTime.Now; byte[] recivedData = new byte[datalength]; Buffer.BlockCopy(dataBuffer, 0, recivedData, 0, datalength); TcRxArgs tcRxArgs = new TcRxArgs(reciveTime, recivedData); if (OnRecived != null) Application.Current.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, new Action(() => OnRecived(Base, this, tcRxArgs))); if (OnRx != null) OnRx(Base, this, tcRxArgs); } }, TaskCreationOptions.LongRunning); t.ContinueWith(t1 => { if (t1.IsFaulted) Base.Log(this, "Reciving ENDED (" + t1.Exception.MostInner().Message + ")"); else Base.Log(this, "Reciving ENDED"); Close(); }, TaskScheduler.Default); t.Start(TaskScheduler.Default); }