/// <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); }
/// <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); }
/// <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); } } }