예제 #1
0
        /// <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());
                }
            }
        }
예제 #2
0
        /// <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();
            }
        }