예제 #1
0
        void ProcessPacketBuffer()
        {
            // Process buffer while there is at least one possible packet
            while (buffer.Count > NetworkPacket.HeaderSize)
            {
                // Get the expected size of the packet
                var size       = IntegerExtender.MakeWord(buffer[2], buffer[1]);
                var packetSize = size + 3;

                // If the entire packet has not been buffered, stop processing until more data arrives
                if (packetSize > buffer.Count)
                {
                    break;
                }

                // Copy packet from buffer
                var dataOffset = 4;
                var dataSize   = packetSize - dataOffset;
                var packet     = new NetworkPacket(buffer[0], size, buffer[3], buffer.GetRange(dataOffset, dataSize));

                // Queue packet and remove bytes from buffer
                packets.Enqueue(packet);
                buffer.RemoveRange(0, packetSize);
            }
        }
예제 #2
0
        public virtual async Task <bool> CheckClientVersionCodeAsync(int versionCode)
        {
            if (versionCode <= 0)
            {
                throw new ArgumentOutOfRangeException("Version code must be greater than zero");
            }

            CheckIfDisposed();

            // Create a client version packet
            var version           = (short)versionCode;
            var versionPacket     = new NetworkPacket(0xAA, 0x00, 0x06, 0x00, version.HiByte(), version.LoByte(), 0x4C, 0x4B, 0x00);
            var versionPacketData = versionPacket.ToArray();

            // Send the version packet to the server
            await socket.SendAsync(versionPacketData, 0, versionPacketData.Length);

            Debug.WriteLine(string.Format("SentPacket: {0}", versionPacket));

            // Receive the response from the server
            var responsePacket = await ReceiveNextPacket();

            Debug.WriteLine(string.Format("ReceivedPacket: {0}", responsePacket));

            // Get the status code from the response
            var statusCode = responsePacket.Data[0];

            if (statusCode == 0x1)  // SERVER MESSAGE
            {
                // Get the server message and raise an exception
                var serverMessage = Encoding.ASCII.GetString(responsePacket.Data.Skip(1).ToArray());
                throw new Exception(string.Format("The server has rejected client version {0}.", versionCode));
            }
            else if (statusCode == 0x2) // PATCH REQUEST
            {
                // Get the required version and raise an exception
                var requiredVersion = IntegerExtender.MakeWord(responsePacket.Data[2], responsePacket.Data[1]);
                throw new Exception(string.Format("The server requires client version {0}.", requiredVersion));
            }

            // Version was accepted by the server
            return(true);
        }
예제 #3
0
 public NetworkPacket(byte[] packet, int offset, int count)
     : this(packet[offset], IntegerExtender.MakeWord(packet[offset + 2], packet[offset + 1]), packet[offset + 3], packet, HeaderSize, count - HeaderSize)
 {
 }