コード例 #1
0
ファイル: NetworkSession.cs プロジェクト: maxc0c0s/ACE
        private void FlushPackets()
        {
            while (PacketQueue.Count > 0)
            {
                ServerPacket packet;
                if (PacketQueue.TryDequeue(out packet))
                {
                    if (packet.Header.HasFlag(PacketHeaderFlags.EncryptedChecksum) && ConnectionData.PacketSequence < 2)
                    {
                        ConnectionData.PacketSequence = 2;
                    }

                    packet.Header.Sequence = ConnectionData.PacketSequence++;
                    packet.Header.Id       = 0x0B; // This value is currently the hard coded Server ID. It can be something different...
                    packet.Header.Table    = 0x14;
                    packet.Header.Time     = (ushort)ConnectionData.ServerTime;

                    if (packet.Header.Sequence >= 2u)
                    {
                        CachedPackets.TryAdd(packet.Header.Sequence, packet);
                    }

                    SendPacket(packet);
                }
            }
        }
コード例 #2
0
ファイル: NetworkSession.cs プロジェクト: Zorgle/ACE
        private void FlushPackets()
        {
            while (PacketQueue.Count > 0)
            {
                ServerPacket packet;
                if (PacketQueue.TryDequeue(out packet))
                {
                    if (packet.Header.HasFlag(PacketHeaderFlags.EncryptedChecksum) && ConnectionData.PacketSequence < 2)
                    {
                        ConnectionData.PacketSequence = 2;
                    }

                    packet.Header.Sequence = ConnectionData.PacketSequence++;
                    packet.Header.Id       = (ushort)(connectionType == ConnectionType.Login ? 0x0B : 0x18);
                    packet.Header.Table    = 0x14;
                    packet.Header.Time     = (ushort)ConnectionData.ServerTime;

                    if (packet.Header.Sequence >= 2u)
                    {
                        CachedPackets.TryAdd(packet.Header.Sequence, packet);
                    }

                    SendPacket(packet);
                }
            }
        }
コード例 #3
0
        void Update()
        {
            Session session = null;

            byte[] data = null;
            while (recvQueue.TryDequeue(out session, out data))
            {
                dispatcher.OnNext(session, data);
            }
            room.GameLoop();
        }
コード例 #4
0
        public void Start()
        {
            serialPort.Open();

            byte[] buffer = new byte[SPO2Packet.PACKET_SIZE];

            reading = true;

            while (reading)
            {
                bool       readOk = true;
                SPO2Packet packet = new SPO2Packet();

                for (int i = 0; i < buffer.Length && readOk; i++)
                {
                    int val = serialPort.ReadByte();
                    if (val == -1)
                    {
                        throw new Exception("Serial Port: End of stream.");
                    }

                    byte readByte = (byte)val;

                    if ((i == 0 && !highBitOn(readByte)) ||
                        (i != 0 && highBitOn(readByte)))
                    {
                        readOk = false;
                    }

                    buffer[i] = readByte;
                }

                packet.Unpack(buffer);

                if (readOk && packet.HeartRate != 0)
                {
                    PacketQueue.Enqueue(packet);
                    while (PacketQueue.Count > maxQueueSize)
                    {
                        SPO2Packet temp;
                        PacketQueue.TryDequeue(out temp);
                    }
                }
            }

            if (serialPort != null)
            {
                serialPort.Close();
            }
        }
コード例 #5
0
 public void FlushPackets()
 {
     while (PacketQueue.Count > 0)
     {
         IStarboundPacket next;
         while (!PacketQueue.TryDequeue(out next))
         {
             ;
         }
         var memoryStream = new MemoryStream();
         var stream       = new StarboundStream(memoryStream);
         next.Write(stream);
         byte[] buffer = new byte[stream.Position];
         Array.Copy(memoryStream.GetBuffer(), buffer, buffer.Length);
         int length     = buffer.Length;
         var compressed = ZlibStream.CompressBuffer(buffer);
         if (compressed.Length < buffer.Length)
         {
             buffer = compressed;
             length = -buffer.Length;
         }
         byte[] header = new byte[StarboundStream.GetSignedVLQLength(length) + 1];
         header[0] = next.PacketId;
         int discarded;
         StarboundStream.WriteSignedVLQ(header, 1, length, out discarded);
         int payloadStart = header.Length;
         Array.Resize(ref header, header.Length + buffer.Length);
         Array.Copy(buffer, 0, header, payloadStart, buffer.Length);
         lock (PacketsWaitingLock)
             PacketsWaiting++;
         EmptyQueueReset.Reset();
         Socket.BeginSend(header, 0, header.Length, SocketFlags.None, r =>
         {
             lock (PacketsWaitingLock)
             {
                 PacketsWaiting--;
                 if (PacketsWaiting == 0)
                 {
                     EmptyQueueReset.Set();
                 }
             }
         }, null);
     }
 }
コード例 #6
0
        private void NetworkWorker()
        {
            while (true)
            {
                if (IsSpawned && nextPlayerUpdate < DateTime.Now)
                {
                    nextPlayerUpdate = DateTime.Now.AddMilliseconds(100);
                    lock (_positionLock)
                    {
                        SendPacket(new PlayerPacket(OnGround));

                        if (_positionChanged)
                        {
                            SendPacket(new PlayerPositionPacket(
                                           Position.X,
                                           Position.Y,
                                           Position.Z,
                                           Position.Y - 1.62,
                                           OnGround
                                           ));
                            _positionChanged = false;
                        }
                    }
                }
                // Send queued packets
                while (PacketQueue.Count != 0)
                {
                    IPacket packet;
                    if (PacketQueue.TryDequeue(out packet))
                    {
                        try
                        {
                            // Write packet
                            NetworkManager.WritePacket(packet, PacketDirection.Serverbound);
                            if (packet is DisconnectPacket)
                            {
                                return;
                            }
                        }
                        catch { /* TODO */ }
                    }
                }
                // Read incoming packets
                var readTimeout = DateTime.Now.AddMilliseconds(20); // Maximum read time given to server per iteration
                while (NetworkStream.DataAvailable && DateTime.Now < readTimeout)
                {
                    try
                    {
                        var packet = NetworkManager.ReadPacket(PacketDirection.Clientbound);
                        HandlePacket(packet);
                        if (packet is DisconnectPacket)
                        {
                            Console.WriteLine(((DisconnectPacket)packet).Reason);
                            return;
                        }
                    }
                    catch (Exception e)
                    {
                        // TODO: OnNetworkException or something
                        Console.WriteLine(e);
                    }
                }
                NetworkingReset.Set();
                NetworkingReset.Reset();
                Thread.Sleep(1);
            }
        }
コード例 #7
0
        public async Task FlushPackets()
        {
            while (PacketQueue.Count > 0)
            {
                try
                {
                    IPacket next;

                    if (!PacketQueue.TryDequeue(out next))
                    {
                        continue;
                    }

                    if (!next.IsReceive)
                    {
                        foreach (var handler in Server.PacketHandlers)
                        {
                            if (next.PacketId == handler.PacketId)
                            {
                                await handler.Handle(next, OtherClient);
                            }
                        }
                    }

                    if (next.Ignore)
                    {
                        continue;
                    }

                    var stream = new StarboundStream();
                    next.Write(stream);

                    byte[] buffer     = stream.ToArray();
                    bool   compressed = stream.Length >= 512;

                    if (compressed)
                    {
                        buffer = ZlibStream.CompressBuffer(buffer);
                    }

                    stream.Dispose();

                    int length = compressed ? -buffer.Length : buffer.Length;

                    var finalStream = new StarboundStream();

                    finalStream.WriteUInt8(next.PacketId);
                    finalStream.WriteSignedVLQ(length);
                    finalStream.Write(buffer, 0, buffer.Length);

                    byte[] toSend = finalStream.ToArray();

                    finalStream.Dispose();

                    if (Socket == null)
                    {
                        return;
                    }

                    var token = new AsyncUserToken();
                    token.Socket = Socket;

                    SocketAsyncEventArgs writeArgs = new SocketAsyncEventArgs();
                    writeArgs.RemoteEndPoint = Socket.RemoteEndPoint;
                    writeArgs.UserToken      = token;
                    writeArgs.SetBuffer(toSend, 0, toSend.Length);
                    writeArgs.Completed += IO_Completed;

                    Socket.SendAsync(writeArgs);
                }
                catch
                {
                    CloseClientSocket(readEventArgs);
                }
            }
        }