예제 #1
0
        public bool SendBufferToFile()
        {
            bool          result    = false;
            DirectoryInfo directory = new DirectoryInfo(FileDirectory);

            if (!directory.Exists)
            {
                directory.Create();
            }

            string path = String.Format(@"{0}//{1}", FileDirectory, FileName);

            //if (File.Exists(path))
            //{
            //    File.Delete(path);
            //    File.Create(path);
            //}

            using (StreamWriter writer = File.AppendText(path))
            {
                lock (locker)
                {
                    foreach (Packet packet in PacketBuffer)
                    {
                        CustomPacket newPacket = new CustomPacket(packet);
                        writer.WriteLine(newPacket.ToString());
                    }
                    PacketBuffer.Clear();
                    result = true;
                }
            }
            return(result);
        }
예제 #2
0
 private void Reset()
 {
     state = ConnectionState.Idle;
     lastIncomingSequence     = SequenceId.Max;
     outgoingSequenceNumber   = SequenceId.Max;
     pendingOutSequenceNumber = outgoingSequenceNumber;
     outSequenceNumber        = 0;
     challengeNonce           = 0;
     connectInfo = new ConnectInfo();
     tendIn.Clear();
     tendOut.Clear();
     incomingPacketBuffer.Clear();
     receivedNotifications.Clear();
     lastStateChange = monotonicClock.NowMilliseconds();
     lastValidHeader = monotonicClock.NowMilliseconds();
     lastSentPackets = monotonicClock.NowMilliseconds();
 }
예제 #3
0
        public bool ProcessNextSegment(byte[] nextSegment, int offset, int len, out IPacket packet)
        {
            packet        = null;
            CurrentPacket = null;

            lock (PacketBuffer)
            {
                if (nextSegment.Length > 0)
                {
                    PacketBuffer.AddRange(new ByteArraySegment(nextSegment, offset, len));
                }

                if (PacketBuffer.Count == 0)
                {
                    return(false);
                }

                if (CurrentPacket == null)
                {
                    var packetId = PacketBuffer[0];

                    var createPacket = ServerBound ? PacketReader.ServerBoundPackets[packetId] : PacketReader.ClientBoundPackets[packetId];
                    if (createPacket != null)
                    {
                        CurrentPacket = createPacket();
                    }
                    else
                    {
                        _trace.TraceData(TraceEventType.Error, 0, $"Unable to read packet type with Id #{packetId:X2}");
                        PacketBuffer.Clear();
                        return(false);
                    }
                }

                if (CurrentPacket != null)
                {
                    using (var listStream = new ByteListMemoryStream(PacketBuffer, 1))
                    {
                        using (var ms = new McStream(listStream))
                        {
                            try
                            {
                                CurrentPacket.ReadPacket(ms);
                            }
                            catch (EndOfStreamException)
                            {
                                _trace.TraceData(TraceEventType.Error, 0, $"unexpected end of packet stream");
                                return(false);
                            }
                        }

                        PacketBuffer.RemoveRange(0, (int)listStream.Position);
                    }

                    packet         = CurrentPacket;
                    CurrentPacket  = null;
                    PreviousPacket = packet;
                }

                return(PacketBuffer.Count > 0);
            }
        }