Exemple #1
0
        /// <summary>
        /// Updates the peer in the tracker database based on the announce parameters
        /// </summary>
        /// <param name="par"></param>
        internal void Update(AnnounceRequest par)
        {
            object peerKey = Comparer.GetKey(par);

            if (!Peers.TryGetValue(peerKey, out Peer peer))
            {
                peer = new Peer(par, peerKey);
                Add(peer);
            }
            else
            {
                Debug.WriteLine($"Updating: {peer.ClientAddress} with key {peerKey}");
                peer.Update(par);
            }
            if (par.Event == TorrentEvent.Completed)
            {
                Downloaded++;
            }

            else if (par.Event == TorrentEvent.Stopped)
            {
                Remove(peer);
            }

            Tracker.RaisePeerAnnounced(new AnnounceEventArgs(peer, this));
            UpdateCounts();
        }
Exemple #2
0
        public bool HandlePeer(int peerId, string name)
        {
            ClosePeer(peerId);

            var peer = new Peer(peerId, name);

            lock (_peerLocker)
            {
                if (Peers.TryGetValue(peerId, out var _))
                {
                    _logger.LogError($"JoinPeer() | Peer[{peerId}] is exists.");
                    return(false);
                }

                Peers[peerId] = peer;
            }

            return(true);
        }
Exemple #3
0
        public bool JoinPeer(int peerId, RtpCapabilities rtpCapabilities)
        {
            lock (_peerLocker)
            {
                if (!Peers.TryGetValue(peerId, out var peer))
                {
                    _logger.LogError($"JoinPeer() | Peer[{peerId}] is not exists.");
                    return(false);
                }

                if (peer.Joined)
                {
                    _logger.LogError($"JoinPeer() | Peer[{peerId}] is joined.");
                    return(false);
                }

                peer.RtpCapabilities = rtpCapabilities;
                peer.Joined          = true;
                return(true);
            }
        }
Exemple #4
0
        public void ClosePeer(int peerId)
        {
            lock (_peerLocker)
            {
                if (!Peers.TryGetValue(peerId, out var peer))
                {
                    return;
                }

                peer.Close();
                Peers.Remove(peerId);

                lock (_peerRoomLocker)
                {
                    var peerRoomToRemove = PeerRoomList.Where(m => m.Peer == peer).ToArray();
                    foreach (var item in peerRoomToRemove)
                    {
                        PeerRoomList.Remove(item);
                    }
                }
            }
        }
Exemple #5
0
        public async Task <bool> PeerEnterRoomAsync(int peerId, Guid roomId)
        {
            // TODO: (alby)代码清理, Room 会预先创建好。
            GetOrCreateRoom(roomId, "Meeting");

            await EnsureRouterAsync(roomId);

            lock (_peerLocker)
            {
                if (!Peers.TryGetValue(peerId, out Peer peer))
                {
                    _logger.LogError($"PeerEnterRoomAsync() | Peer[{peerId}] is not exists.");
                    return(false);
                }

                using (_roomLocker.Lock())
                {
                    if (!Rooms.TryGetValue(roomId, out Room room))
                    {
                        _logger.LogError($"PeerEnterRoomAsync() | Room[{roomId}] is not exists.");
                        return(false);
                    }

                    lock (_peerRoomLocker)
                    {
                        var peerRoom = new PeerRoom(peer, room);
                        // TODO: (alby)目前暂时只允许进入一个房间
                        if (PeerRoomList.Contains(peerRoom))
                        {
                            return(false);
                        }
                        PeerRoomList.Add(peerRoom);
                        return(true);
                    }
                }
            }
        }
Exemple #6
0
        private async Task <(RpcResponse rpcResp, NetError err)> MakeRpc(string target, object args, TimeSpan tmout)
        {
            bool       ok;
            ITransport peer;

            using (await sync.LockAsync())
            {
                ok = Peers.TryGetValue(target, out peer);
            }

            if (!ok || peer == null)
            {
                return(null, new NetError($"Failed to connect to peer: {target}"));
            }

            var rpc = new Rpc {
                Command = args, RespChan = new AsyncProducerConsumerQueue <RpcResponse>()
            };

            await peer.Consumer.EnqueueAsync(rpc);

            var responseTask = rpc.RespChan.DequeueAsync();

            var timeoutTask = Task.Delay(tmout);

            var resultTask = await Task.WhenAny(responseTask, timeoutTask);

            if (resultTask == timeoutTask)
            {
                return(null, new NetError("command timed out"));
            }

            var rpcResp = responseTask.Result;

            return(rpcResp, rpcResp.Error);
        }