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