Ejemplo n.º 1
0
        // Notifies a peer with a command, no response expected
        internal void Reply(LevinPeer Peer, int CommandCode, byte[] Data, bool RequestSuccessul = false, bool ResponseRequired = false)
        {
            // Form message header
            BucketHead2 Header = new BucketHead2
            {
                Signature        = GlobalsConfig.LEVIN_SIGNATURE,
                ResponseRequired = ResponseRequired,
                PayloadSize      = (ulong)Data.Length,
                CommandCode      = (uint)CommandCode,
                ProtocolVersion  = GlobalsConfig.LEVIN_VERSION,
                Flags            = LEVIN_PACKET_RESPONSE,
                ReturnCode       = RequestSuccessul? LEVIN_RETCODE_SUCCESS : LEVIN_RETCODE_FAILURE
            };

            // Debug
            Logger?.Log(Level.DEBUG, "Sending header:");
            Logger?.Log(Level.DEBUG, " - Signature: {0}", Header.Signature);
            Logger?.Log(Level.DEBUG, " - Payload Size: {0}", Header.PayloadSize);
            Logger?.Log(Level.DEBUG, " - Response Required: {0}", Header.ResponseRequired);
            Logger?.Log(Level.DEBUG, " - Command Code: {0}", Header.CommandCode);
            Logger?.Log(Level.DEBUG, " - Return Code: {0}", Header.ReturnCode);
            Logger?.Log(Level.DEBUG, " - Flags: {0}", Header.Flags);
            Logger?.Log(Level.DEBUG, " - Protocol Version: {0}", Header.ProtocolVersion);

            // Send header packet
            if (Server.SendMessage(Peer.Connection, Header.Serialize()))
            {
                // Send body packet
                Server.SendMessage(Peer.Connection, Data);
            }
        }
Ejemplo n.º 2
0
        // Notifies a peer with a command, no response expected
        public void Reply(LevinPeer Peer, int CommandCode, byte[] Data, bool RequestSuccessul = false, bool ResponseRequired = false)
        {
            // Form message header
            BucketHead2 Header = new BucketHead2
            {
                Signature        = GlobalsConfig.LEVIN_SIGNATURE,
                ResponseRequired = ResponseRequired,
                PayloadSize      = (ulong)Data.Length,
                CommandCode      = (uint)CommandCode,
                ProtocolVersion  = GlobalsConfig.LEVIN_VERSION,
                Flags            = LEVIN_PACKET_RESPONSE,
                ReturnCode       = RequestSuccessul? LEVIN_RETCODE_SUCCESS : LEVIN_RETCODE_FAILURE
            };

            // Debug
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, "Sending header:", LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Signature: " + Header.Signature, LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Payload Size: " + Header.PayloadSize, LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Response Required: " + Header.ResponseRequired, LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Command Code: " + Header.CommandCode, LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Return Code: " + Header.ReturnCode, LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Flags: " + Header.Flags, LogLevel.DEBUG);
            ConsoleMessage.WriteLine(ConsoleMessage.DefaultColor, " - Protocol Version: " + Header.ProtocolVersion, LogLevel.DEBUG);

            // Send header packet
            if (Server.SendMessage(Peer.Connection, Header.Serialize()))
            {
                // Send body packet
                Server.SendMessage(Peer.Connection, Data);
            }
        }
Ejemplo n.º 3
0
        // Data received
        private void OnDataReceived(object sender, EventArgs e)
        {
            // Get packet data
            Packet    Packet = (Packet)sender;
            LevinPeer Peer   = Peers[Packet.Peer];

            // Read header
            if (Peer.ReadStatus == PacketReadStatus.Head)
            {
                // Decode header
                try { Peer.Header = BucketHead2.Deserialize(Packet.Data); }
                catch
                {
                    Logger?.Log(Level.DEBUG, "Could not deserialize incoming packet header, incorrect format");
                    return;
                }

                // Set peer data
                Peer.Data = Packet.Data;

                // Debug

                /*Logger?.Log(Level.DEBUG, "Received header:");
                 * Logger?.Log(Level.DEBUG, " - Signature: {0}", Peers[Packet.Peer].Header.Signature);
                 * Logger?.Log(Level.DEBUG, " - Payload Size: {0}", Peers[Packet.Peer].Header.PayloadSize);
                 * Logger?.Log(Level.DEBUG, " - Response Required: {0}", Peers[Packet.Peer].Header.ResponseRequired);
                 * Logger?.Log(Level.DEBUG, " - Command Code: {0}", Peers[Packet.Peer].Header.CommandCode);
                 * Logger?.Log(Level.DEBUG, " - Return Code: {0}", Peers[Packet.Peer].Header.ReturnCode);
                 * Logger?.Log(Level.DEBUG, " - Flags: {0}", Peers[Packet.Peer].Header.Flags);
                 * Logger?.Log(Level.DEBUG, " - Protocol Version: {0}", Peers[Packet.Peer].Header.ProtocolVersion);*/

                // Check that signature matches
                if (Peer.Header.Signature != GlobalsConfig.LEVIN_SIGNATURE)
                {
                    Logger?.Log(Level.DEBUG, "Incoming packet signature mismatch, expected {0}, received {1}", GlobalsConfig.LEVIN_SIGNATURE, Peers[Packet.Peer].Header.Signature);
                    return;
                }

                // Check packet size
                if (Peer.Header.PayloadSize > GlobalsConfig.LEVIN_MAX_PACKET_SIZE)
                {
                    Logger?.Log(Level.DEBUG, "Incoming packet size is too big, max size is {0}, received {1}", GlobalsConfig.LEVIN_MAX_PACKET_SIZE, Packet.Data.Length);
                    return;
                }

                // Set new read status
                if (Peer.Header.PayloadSize > 0)
                {
                    Peers[Packet.Peer].ReadStatus = PacketReadStatus.Body;
                }
            }

            // Add data to peer buffer if reading message body
            else
            {
                // Add bytes to peer buffer
                byte[] NewData = new byte[Peer.Data.Length + Packet.Data.Length];
                Buffer.BlockCopy(Peer.Data, 0, NewData, 0, Peer.Data.Length);
                Buffer.BlockCopy(Packet.Data, 0, NewData, Peer.Data.Length, Packet.Data.Length);
                Peer.Data = NewData;
            }

            // Check if data size matches payload size and that a header has been decoded
            if (Peer.ReadStatus == PacketReadStatus.Body && (ulong)Peer.Data.Length >= Peer.Header.PayloadSize)
            {
                // Get header
                BucketHead2 Header = Peer.Header;

                // Decode command
                Command Command = new Command
                {
                    CommandCode    = Header.CommandCode,
                    IsNotification = !Header.ResponseRequired,
                    IsResponse     = (Header.Flags & LEVIN_PACKET_RESPONSE) == LEVIN_PACKET_RESPONSE,
                    Data           = Encoding.SplitByteArray(Peers[Packet.Peer].Data, 33, (int)Peers[Packet.Peer].Header.PayloadSize)
                };

                // Check if peer requires a handshake
                if (Command.CommandCode == Commands.Handshake.Id)
                {
                    Commands.Handshake.Invoke(this, Peer, Command);                                               // 1001
                }
                else if (Peer.State == PeerState.Verified)
                {
                    // Invoke other commands
                    if (Command.CommandCode == Commands.Ping.Id)
                    {
                        Commands.Ping.Invoke(this, Peer, Command);                                          // 1002
                    }
                    else if (Command.CommandCode == Commands.TimedSync.Id)
                    {
                        Commands.TimedSync.Invoke(this, Peer, Command);                                                    // 1003
                    }
                    else if (Command.CommandCode == Commands.NotifyRequestChain.Id)
                    {
                        Commands.NotifyRequestChain.Invoke(this, Peer, Command);                                                             // 2006
                    }
                    else if (Command.CommandCode == Commands.RequestTxPool.Id)
                    {
                        Commands.RequestTxPool.Invoke(this, Peer, Command);                                                        // 2008
                    }
                }

                // Debug
                else if (Peer.State == PeerState.Unverified)
                {
                    Logger?.Log(Level.DEBUG, "[IN] Received command:");
                    Logger?.Log(Level.DEBUG, " - Command Code: {0}", Command.CommandCode);
                    Logger?.Log(Level.DEBUG, " - Is Notification: {0}", Command.IsNotification);
                    Logger?.Log(Level.DEBUG, " - Is Response: {0}", Command.IsResponse);
                    Logger?.Log(Level.DEBUG, " - Data: {0} Bytes", Command.Data.Length);
                    Logger?.Log(Level.DEBUG, Encoding.ByteArrayToHexString(Command.Data));
                }

                // Set new read status and clear previous request
                Peer.ReadStatus = PacketReadStatus.Head;
                Peer.Header     = default(BucketHead2);
                Peer.Data       = new byte[0];
            }
        }