示例#1
0
        protected override void ProcessIncomingData(byte[] data, int start, int len)
        {
            //if (data.Length > 0)
            if (len > 0)
            {
                var type = (Utilities.PackType)data[start];
                switch (type)
                {
                case Utilities.PackType.Udp:
                    var realdata = new byte[len - 1];    //todo , try to reuse
                    Array.Copy(data, start + 1, realdata, 0, realdata.Length);
                    if (Incoming != null)
                    {
                        Incoming.Enqueue(realdata);
                    }
                    break;

                case Utilities.PackType.Kcp:
                    base.ProcessIncomingData(data, start + 1, len - 1);
                    break;

                default:
                    //unknown packtype, drop it
                    debug($"unknown packtype, drop it. typeid = {type}");
                    break;
                }
            }
        }
示例#2
0
        // *****************************************************************************************************
        //  method  :   private void ReaderProcess()
        //  purpose :   provide a continuous method to run in a parallel thread method which will read in data
        //              from the open Port and place it in the Incoming Queue
        //  notes   :   -1 (STOP_BIT) will be enqueued into Incoming if the end of stream is met
        // *****************************************************************************************************
        private void ReaderProcess()
        {
            while (_isRunning)
            {
                try
                {
                    Incoming.Enqueue((byte)Port.ReadChar());
                }
                catch (TimeoutException) { }

                Thread.Sleep(DEFAULT_READ_DELAY_MS);
            }
        }
 protected override bool QueueOrDiscardPendingPackages(EndPoint endPoint, PendingPacket packet)
 {
     foreach (var pending in pendingPackets)
     {
         if (pending.Key < RemoteSequence)
         {
             Incoming.Enqueue(pending.Value);
         }
     }
     if (!base.QueueOrDiscardPendingPackages(endPoint, packet))
     {
         pendingPackets.Add(packet.Sequence, packet);
         return(false);
     }
     return(true);
 }
示例#4
0
        private void ProcessRead(byte read)
        {
            switch (read)
            {
            case START_TRANSMISSION:
                Incoming.Clear();
                break;

            case STOP_TRANSMISSION:
                ProcessTransmission();
                break;

            default:
                Incoming.Enqueue(read);
                break;
            }
        }
        public override PendingPacket QueueIncomingPacket(EndPoint endPoint, Packet packet)
        {
            PendingPacket pendingPacket = base.QueueIncomingPacket(endPoint, packet);

            foreach (var pending in pendingPackets)
            {
                if (!base.QueueOrDiscardPendingPackages(pending.Value.RemoteEndPoint, pending.Value))
                {
                    break;
                }
                Incoming.Enqueue(pending.Value);
            }
            long now = DateTime.Now.Ticks;

            for (int i = pendingPackets.Count - 1; i >= 0; i--)
            {
                if (pendingPackets.Keys[i] < RemoteSequence || (now - pendingPackets.Values[0].Sent > PacketExpire.Ticks))
                {
                    pendingPackets.RemoveAt(i);
                }
            }
            return(pendingPacket);
        }
        /// <summary>
        /// Initializes the events
        /// </summary>
        private void InitEvents()
        {
            OnMessage += (message) => {
                TCPFileCode code = (TCPFileCode)message.Content[0];
                string      json = Encoding.UTF8.GetString(message.Content.Skip(1).ToArray());

                if (code == TCPFileCode.Enqueue)
                {
                    TCPFileTransferData data = JsonConvert.DeserializeObject <TCPFileTransferData>(json);

                    Incoming.Enqueue(new TCPFileProgress()
                    {
                        Cache        = new TCPFileCache(data.FullFileName),
                        TransferData = data
                    });

                    using (MemoryStream ms = new MemoryStream()) {
                        TCPReaderWriter.WriteNumber(ms, data.ID, false);
                        Send(TCPFileCode.Reply, ms.ToArray());
                    }
                }
            };
        }