Пример #1
0
    public void Process()
    {
        while (m_socket.Available > 0)
        {
            int size = m_in.Length;
            size         += m_socket.Receive(m_in.GetBuffer(), size, m_in.Capacity - size, SocketFlags.None);
            m_in.Position = 0;
            m_in.SetLength(size);
            PickMsg();
        }

        PickMsg();

        FlushSending();
    }
Пример #2
0
            public int Receive(byte[] buffer, int offset, int _size, SocketFlags flags)
            {
                int size = m_receiveStream.Length - m_receiveStream.Position;

                Array.Copy(m_receiveStream.GetBuffer(), m_receiveStream.Position, buffer, offset, size);
                m_receiveStream.Position = 0;
                m_receiveStream.SetLength(0);
                return(size);
            }
Пример #3
0
        public void Test()
        {
            var bs = new BinaryStream();

            bs.WriteAddress(new IPEndPoint(IPAddress.Parse("192.168.1.10"), 19132));
            Assert.Equal(bs.GetBuffer(), new byte[7] {
                0x04, 0x3f, 0x57, 0xfe, 0xf5, 0xbc, 0x4a
            });
            bs.Clear();

            bs.WriteAddress(new IPEndPoint(IPAddress.Parse("2404:6800:4004:0810:0000:0000:0000:2004"), 19132));
            Assert.Equal(bs.GetBuffer(), new byte[21]
            {
                0x06,
                0x17, 0x00,
                0xbc, 0x4a,
                0x24, 0x04, 0x68, 0x00, 0x40, 0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04
            });
        }
Пример #4
0
        public void Test()
        {
            var bs = new BinaryStream();

            new UnconnectedPong
            {
                Timestamp  = 0x0123456789ff,
                PongId     = 1,
                Magic      = Constants.Magic,
                ServerInfo = "MCBEProtocol Test Server"
            }.Encode(bs);
            Assert.Equal(bs.GetBuffer(), new byte[]
            {
                // Timestamp
                0xff, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00,
                // PongId
                0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                // Magic
                0x00, 0xff, 0xff, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0x12, 0x34, 0x56, 0x78,
                // ServerName Length
                0x18, 0x00,
                // ServerName
                0x4d, 0x43, 0x42, 0x45, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72
            });
            bs.Clear();

            new UnconnectedPing
            {
                Timestamp = 0x0123456789ff,
                Magic     = Constants.Magic,
                ClientId  = 0xfedcba98765432
            }.Encode(bs);
            Assert.Equal(bs.GetBuffer(), new byte[]
            {
                // Timestamp
                0xff, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00,
                // Magic
                0x00, 0xff, 0xff, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0x12, 0x34, 0x56, 0x78,
                // ClientId
                0x32, 0x54, 0x76, 0x98, 0xba, 0xdc, 0xfe, 0x00
            });
            bs.Clear();
        }
        public byte[] Encode()
        {
            BinaryStream stream = new BinaryStream();

            stream.WriteByte((byte)((byte)Reliability << 4 | (IsSplit ? 1 : 0)));
            stream.WriteUInt(MessageId, ByteOrder.Little);
            stream.WriteUShort(SplitId, ByteOrder.Little);
            stream.WriteUShort(SplitIndex, ByteOrder.Little);
            stream.WriteUShort(LastSplitIndex, ByteOrder.Little);

            stream.WriteUShort((ushort)Payload.Length, ByteOrder.Little);
            stream.WriteBytes(Payload);

            return(stream.GetBuffer());
        }
Пример #6
0
 public void FlushSending()
 {
     if (m_out.Length > 0)
     {
         try
         {
             m_socket.Send(m_out.GetBuffer(), 0, m_out.Length, SocketFlags.None);
             m_out.Position = 0;
             m_out.SetLength(0);
         }
         catch (Exception e)
         {
             Console.WriteLine("Send failed! {0}" + e.Message);
         }
     }
 }
Пример #7
0
        public override void DecodePayload()
        {
            LoginData  = new LoginData();
            ClientData = new ClientData();

            Protocol = ReadInt();

            int len = ReadVarInt();

            using (BinaryStream stream = new BinaryStream(ReadBytes(len)))
            {
                int loginDataLen = stream.ReadInt(ByteOrder.Little);
                ReadLoginData(stream.ReadBytes(loginDataLen));
                int clientDataLen = stream.ReadInt(ByteOrder.Little);
                ReadClientData(stream.ReadBytes(clientDataLen));

                WriteBytes(stream.GetBuffer());
            }
        }
Пример #8
0
        public static void Main(string[] args)
        {
            if (args.Length > 0 && args[0] == "server")
            {
                _client = new ReliabilityUdpClient(new IPEndPoint(IPAddress.Any, 6000), data => { }, ReceiveServer);
                _client.Listen();
            }
            else
            {
                _client = new ReliabilityUdpClient(new IPEndPoint(IPAddress.Any, 0), Connection, ReceiveClient);
                _client.Listen();

                bool b = _client.ConnectionAsync(new IPEndPoint(IPAddress.Parse("133.167.115.186"), 6000)).Result;
                if (!b)
                {
                    Console.WriteLine("Connection Error");
                    return;
                }
            }

            while (true)
            {
                string chat = Console.ReadLine();

                if (chat == "%exit")
                {
                    break;
                }

                using (BinaryStream stream = new BinaryStream())
                {
                    stream.WriteByte(1);
                    stream.WriteStringUtf8(chat);

                    foreach (var session in _client.GetSessions())
                    {
                        session.SendPacket(new CustomDataPacket(stream.GetBuffer()));
                    }
                }
            }
        }
Пример #9
0
        private void LoadLanguages()
        {
            if (!string.IsNullOrWhiteSpace(_folder))
            {
                _languageFiles.Clear();
                _files.Clear();

                _directoryInfo = new DirectoryInfo(_folder);
                if (_directoryInfo.Exists)
                {
                    BinaryStream stream = new BinaryStream();
                    stream.WriteStringUtf8(_folder);
                    File.WriteAllBytes("Data_00.bin", stream.GetBuffer());

                    foreach (FileInfo fileInfo in _directoryInfo.GetFiles("*.json"))
                    {
                        LanguageFile languageFile = new LanguageFile(fileInfo);
                        _languageFiles.Add(languageFile.GetCulture(), languageFile);
                        _files.Add(languageFile.GetCulture(), fileInfo);
                    }
                }
            }
        }
Пример #10
0
        public void OnReceive(DataPacket dataPacket)
        {
            AckPacket packet = new AckPacket(new[] { dataPacket.SequenceId });

            _client.Send(EndPoint, packet);

            if (dataPacket.SequenceId > ReceiveSequenceId)
            {
                uint seq = dataPacket.SequenceId - ReceiveSequenceId;
                for (uint i = 0; i < seq; i++)
                {
                    NackPacket nackPacket = new NackPacket(new[] { dataPacket.SequenceId - i - 1 });
                    _client.Send(EndPoint, nackPacket);
                }
            }

            if (dataPacket.SequenceId >= ReceiveSequenceId)
            {
                ReceiveSequenceId = dataPacket.SequenceId + 1;
            }

            EncapsulatedPacket encapsulatedPacket = new EncapsulatedPacket();

            encapsulatedPacket.Decode(dataPacket.Data);

            if (encapsulatedPacket.IsSplit)
            {
                if (!SplitsPackets.ContainsKey(encapsulatedPacket.SplitId))
                {
                    SplitsPackets[encapsulatedPacket.SplitId] =
                        new List <EncapsulatedPacket>();
                }

                SplitsPackets[encapsulatedPacket.SplitId].Add(encapsulatedPacket);

                if (SplitsPackets[encapsulatedPacket.SplitId].Count == encapsulatedPacket.LastSplitIndex + 1)
                {
                    SplitsPackets[encapsulatedPacket.SplitId].Sort(Comparison);
                    BinaryStream stream = new BinaryStream();
                    foreach (var splitsPacket in SplitsPackets[encapsulatedPacket.SplitId])
                    {
                        stream.WriteBytes(splitsPacket.Payload);
                    }

                    SplitsPackets.Remove(encapsulatedPacket.SplitId);

                    encapsulatedPacket = new EncapsulatedPacket(encapsulatedPacket.Reliability,
                                                                encapsulatedPacket.MessageId, stream.GetBuffer());
                }
                else
                {
                    return;
                }
            }

            if (!MessageWindow.Contains(encapsulatedPacket.MessageId))
            {
                if (MessageWindow.Count >= 50)
                {
                    MessageWindow.RemoveAt(0);
                }

                MessageWindow.Add(encapsulatedPacket.MessageId);
                OnEncapsulatedPacket(encapsulatedPacket);
            }
        }
Пример #11
0
 public int Send(byte[] buf, int offset, int size, SocketFlags flags)
 {
     Array.Copy(buf, offset, m_sendStream.GetBuffer(), m_sendStream.Position, size);
     m_sendStream.SetLength(m_sendStream.Length + size);
     return(size);
 }