private void OnConnectToPeerWithTrackerMessage(PacketHeader packetHeader, Connection connection, ConnectToPeerWithTrackerMessage incomingObject) { Peer peerToConnect = allPeers.FirstOrDefault(peer => peer.Address.Equals(incomingObject.RecieverAddress)); if (peerToConnect != null) { if (!ConnectedPeers.Contains(peerToConnect)) { ConnectedPeers.Add(peerToConnect); } if (!peerToConnect.ConnectedPeers.Contains(this)) { peerToConnect.ConnectedPeers.Add(this); try { peerToConnect.Connection.SendObject(incomingObject.GetType().Name, incomingObject); } catch { peerToConnect.OnError(); } } } //если трекер не нашел пир адресат то отправляем отправителю дисконнект адресата else { var message = new PeerDisconnectMessage(incomingObject.SenderAddress); Connection.SendObject(message.GetType().Name, message); } }
public void Disconnect() { t.Elapsed -= CheckConnection; allPeers.Remove(this); var ConnectedPeersCopy = new List <Peer>(ConnectedPeers); foreach (var peer in ConnectedPeersCopy) { //удалить это пир из списка того пира peer.ConnectedPeers.Remove(this); //отправить тому пиру сообщение об отключении var message = new PeerDisconnectMessage(Address); try { peer.Connection.SendObject(message.GetType().Name, message); } catch { peer.OnError(); } } Task.Run(() => { try { Connection?.Dispose(); Connection = null; } catch { } }); Status = PeerStatus.Disconnected; CommonHelpers.LogPeers(allPeers); }