Example #1
0
        public void Disconnect()
        {
            allTrackers.Remove(this);

            OnTrackerDelete?.Invoke(this, new EventArgs());

            if (Status == TrackerStatus.Connected)
            {
                var message = new PeerDisconnectMessage(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true));
                try
                {
                    Connection.SendObject(message.GetType().Name, message);
                }
                catch { }
            }

            Task.Run(() =>
            {
                try
                {
                    Connection?.Dispose();
                    Connection = null;
                }
                catch { }
            });

            Status = TrackerStatus.Disconnected;

            CommonHelpers.LogTrackers(allTrackers);
        }
Example #2
0
        public void Connect()
        {
            Started = true;

            ParseTrackers();

            try
            {
                if (CommonHelpers.GetLocalEndPoint(1, true) != null && VotingsUser.PeerDiscovery)
                {
                    PeerDiscovery.MinTargetLocalIPPort = CommonHelpers.DiscoveryPort;
                    PeerDiscovery.MaxTargetLocalIPPort = CommonHelpers.DiscoveryPort;
                    PeerDiscovery.OnPeerDiscovered    -= PeerDiscovered;
                    PeerDiscovery.OnPeerDiscovered    += PeerDiscovered;
                    PeerDiscovery.EnableDiscoverable(PeerDiscovery.DiscoveryMethod.UDPBroadcast, CommonHelpers.GetLocalEndPoint(CommonHelpers.DiscoveryPort));
                }

                TCPConnection.StartListening(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort), false);
            }
            catch
            {
                NetworkComms.Logger.Error("Can't start listener on this IP: " + CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort).ToString());
            }

            NetworkComms.Logger.Warn("===== Client started =====");


            ConnectToTrackers();
            RequestPeers();
            ConnectToPeers();
            t.Start();
        }
Example #3
0
        private void AddPeer(EndPoint address, Tracker tracker = null, bool withTracker = false)
        {
            if (!(Peers.Any(peer => peer.Address.Equals(address))) &&
                !(address.Equals(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true))))
            {
                var peer = new Peer(address, Peers, tracker);
                Peers.Add(peer);

                //перенаправляем события пира
                peer.OnRequestBlocksMessage += (s, e) =>
                {
                    OnRequestBlocksMessage?.Invoke(s, e);
                };

                peer.OnRequestTransactionsMessage += (s, e) =>
                {
                    OnRequestTransactionsMessage?.Invoke(s, e);
                };

                peer.OnBlocksMessage += (s, e) =>
                {
                    OnBlocksMessage?.Invoke(s, e);
                };

                peer.OnTransactionsMessage += (s, e) =>
                {
                    OnTransactionsMessage?.Invoke(s, e);
                };

                peer.OnPeersMessage += (s, e) => OnPeersMessage(s, e);



                peer.Connect(withTracker);


                //вызов события подключения пира
                Task.Run(() =>
                {
                    System.Threading.Thread.Sleep(CommonHelpers.MessagesInterval * 5);

                    OnPeerConnected?.Invoke(this, new MessageEventArgs(new Message(), peer.Hash, peer.Address));
                });
            }
        }
Example #4
0
 public void ConnectPeerToPeer(Peer peerToConnect)
 {
     if (Status == TrackerStatus.Connected)
     {
         var message = new ConnectToPeerWithTrackerMessage(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true), peerToConnect.Address);
         try
         {
             Connection.SendObject(message.GetType().Name, message);
         }
         catch
         {
             Status = TrackerStatus.Disconnected;
             Connect();
         }
     }
     else
     {
         Connect();
     }
 }
Example #5
0
        public void SendMessageToPeer(Message message, Peer peer)
        {
            if (Status == TrackerStatus.Connected)
            {
                NetworkComms.Logger.Warn("Sent message: " + message.Type.ToString());

                var shellMessage = new ToPeerMessage(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true), peer.Address, message);
                try
                {
                    Connection.SendObject(shellMessage.GetType().Name, shellMessage);
                }
                catch
                {
                    Status = TrackerStatus.Disconnected;
                    Connect();
                }
            }
            else
            {
                Connect();
            }
        }
Example #6
0
        private void OnToPeerMessage(PacketHeader packetHeader, Connection connection, ToPeerMessage incomingObject)
        {
            NetworkComms.Logger.Warn("Received message: " + incomingObject.Message.Type.ToString());

            if (incomingObject.RecieverAddress.Equals(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort, true)))
            {
                var eventArgs = new MessageEventArgs(incomingObject.Message, null, incomingObject.SenderAddress);

                if (incomingObject.Message is PeerHashMessage)
                {
                    OnPeerHashMessage?.Invoke(this, eventArgs);
                }
                else if (incomingObject.Message is RequestPeersMessage)
                {
                    OnRequestPeersMessage?.Invoke(this, eventArgs);
                }
                else if (incomingObject.Message is PeersMessage)
                {
                    OnPeersMessageFromPeer?.Invoke(this, eventArgs);
                }
                else if (incomingObject.Message is RequestBlocksMessage)
                {
                    OnRequestBlocksMessage?.Invoke(this, eventArgs);
                }
                else if (incomingObject.Message is RequestTransactionsMessage)
                {
                    OnRequestTransactionsMessage?.Invoke(this, eventArgs);
                }
                else if (incomingObject.Message is BlocksMessage)
                {
                    OnBlocksMessage?.Invoke(this, eventArgs);
                }
                else if (incomingObject.Message is TransactionsMessage)
                {
                    OnTransactionsMessage?.Invoke(this, eventArgs);
                }
            }
        }
Example #7
0
        public void DisconnectAny(bool sendMessage = true)
        {
            allPeers.Remove(this);

            CommonHelpers.LogPeers(allPeers);

            try
            {
                if (sendMessage)
                {
                    var message = new PeerDisconnectMessage(CommonHelpers.GetLocalEndPoint(CommonHelpers.PeerPort));

                    if (ConnectionMode == ConnectionMode.Direct)
                    {
                        Connection.SendObject(message.GetType().Name, message);
                    }
                    else
                    {
                        tracker.SendMessageToPeer(message, this);
                    }
                }

                Task.Run(() =>
                {
                    try
                    {
                        Connection?.Dispose();
                        Connection = null;
                    }
                    catch { }
                });
            }
            catch { }

            Status = PeerStatus.Disconnected;
        }