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