/// <summary> /// Function to receive peers from one or your peers peer list /// </summary> /// <param name="message">It is the message which is sent to the receiver</param> private void ReceivedPeerFetch(PeerFetcherMessage message) { if (message.type.Equals(TypeCode.REQUEST)) { var outgoing = new List <Peer>(); var incoming = message.peers; // Adding sender to list if (!InPeerList(message.fromUuid, _peers)) { _peers.TryAdd(message.fromUuid, new Peer(message.fromUuid, message.fromIp)); } //Checks whether a incomming peer exists in the peerlist. foreach (var incomingPeer in incoming) { if (InPeerList(incomingPeer.GetUuid(), _peers)) { break; } _peers.TryAdd(incomingPeer.GetUuid(), incomingPeer); DiskHelper.ConsoleWrite("Peer added: " + incomingPeer.GetUuid()); } foreach (var outGoingPeer in _peers) { if (InPeerList(outGoingPeer.Value.GetUuid(), incoming)) { break; } if (outGoingPeer.Value.GetUuid() == message.fromUuid) { break; } outgoing.Add(outGoingPeer.Value); } message.CreateReply(); message.peers = outgoing; message.Send(); } else { // Rechieved response foreach (Peer incomingPeer in message.peers) { if (InPeerList(incomingPeer.GetUuid(), _peers)) { break; } if ((IdHandler.GetUuid().Equals(incomingPeer.GetUuid()))) { break; } _peers.TryAdd(incomingPeer.GetUuid(), incomingPeer); Console.WriteLine("Peer added: " + incomingPeer.GetUuid()); } } }
/// <summary> /// Function to receive ping /// </summary> /// <param name="ping">The ping message to be received</param> private void ReceivedPing(PingMessage ping) { // Update peer foreach (var peer in _peers) { if (peer.Value.GetUuid().Equals(ping.fromUuid)) { peer.Value.SetIp(ping.fromIp); peer.Value.UpdateLastSeen(); peer.Value.SetOnline(true); peer.Value.diskSpace = ping.diskSpace; if (ping.type.Equals(TypeCode.RESPONSE)) { peer.Value.AddPingToList(ping.GetElapsedTime()); } } } // Respond to ping if (ping.type.Equals(TypeCode.REQUEST)) { ping.CreateReply(); ping.statusCode = StatusCode.OK; ping.diskSpace = DiskHelper.GetTotalAvailableSpace(_path); ping.Send(); } else { // Received response, should send peerlist var peerFetch = new PeerFetcherMessage(GetAPeer(ping.fromUuid)) { peers = this.GetPeerList() }; // Removed the receiver from the list, as he should not add himself foreach (Peer peer in peerFetch.peers) { if (string.Compare(peer.GetIp().Trim(), peerFetch.toIp.Trim(), StringComparison.Ordinal) == 0) { peerFetch.peers.Remove(peer); break; } } peerFetch.Send(); } }