Example #1
0
        /// <summary>
        /// Handle incoming ping request responses and saves them in the current working data dictionary
        /// If a PingOK packet is received, the suspected peer is considered alive.
        /// If a PingFailed packet is received and that's the only kind of messages that
        /// have been received concerning this peer, the peer is concidered dead.
        /// </summary>
        /// <param name="message">The message to handle</param>
        /// <returns>AcceptAndFinish if all suspected peers is concluded dead or alive.
        /// Accept if the packet is of type PingOK or PingFailed. Decline otherwise</returns>
        public PacketResponse HandlePacket(Message message)
        {
            if (message.MessageType != MessageType.PingOk && message.MessageType != MessageType.PingFailed)
            {
                return(PacketResponse.Decline);
            }

            IPAddress pingedIp;
            var       validIp = IPAddress.TryParse(message.DataAsString, out pingedIp);

            if (!validIp)
            {
                message.DeemInvalid();
                return(PacketResponse.Decline);
            }

            if (nonRespondingPeers.ContainsKey(pingedIp))
            {
                UpdateResponses(pingedIp, message.Sender, message.MessageType);
            }

            if (nonRespondingPeers.Count == 0)
            {
                var vrl = new VoteReponseListener(networkListener, vote);
                networkListener.RegisterHandler(vrl, VoteReponseListener.Timeout);
                vote.SendToAll();
                return(PacketResponse.AcceptAndFinish);
            }

            return(PacketResponse.Accept);
        }
Example #2
0
        /// <summary>
        /// Handles a PingRequest packet by creating a <see cref="PongListener">PongListener</see> and sending a ping to the suspect
        /// </summary>
        /// <param name="pingRequest">The received PingRequest object</param>
        /// <returns>Accept or Decline depending on what type of packet was received</returns>
        public PacketResponse HandlePacket(Message pingRequest)
        {
            if (pingRequest.MessageType != MessageType.PingRequest)
            {
                return(PacketResponse.Decline);
            }

            IPAddress peerToPing;
            var       valid = IPAddress.TryParse(pingRequest.DataAsString, out peerToPing);

            if (!valid)
            {
                pingRequest.DeemInvalid();
                return(PacketResponse.Decline);
            }

            var pongListener = new PongListener(pingRequest.Sender, peerToPing);

            networkListener.RegisterHandler(pongListener, PongListener.Timeout);

            var ping = new Message(MessageType.Ping, peerToPing);

            Outbox.SendMessage(ping);

            return(PacketResponse.Accept);
        }
Example #3
0
        /// <summary>
        /// Creates a new PingRequestResponseListener and sends out a new PingRequest
        /// message to each of the peers that has not yet replied in the VoteReplyList.
        /// </summary>
        public void TimedOut()
        {
            var prrl = new PingRequestResponseListener(networkListener, vote);

            networkListener.RegisterHandler(prrl, PingRequestResponseListener.Timeout);

            foreach (var peer in vote.VoteReplyList)
            {
                if (!peer.Value)
                {
                    var pingRequest = new Message(MessageType.PingRequest)
                    {
                        DataAsString = peer.Key.ToString()
                    };
                    Outbox.SendMessage(pingRequest);
                }
            }
        }