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