示例#1
0
        public async Task AddIncomingPeer(Socket socket)
        {
            var peer = new Peer(socket, isSeed: false, isIncoming: true);

            try
            {
                await ConnectAndHandshake(peer);

                PeerHandshakeCompleted?.Invoke(peer);

                this.pendingPeers.TryRemove(peer);
                this.connectedPeers.TryAdd(peer);
            }
            catch (Exception e)
            {
                DisconnectPeer(peer, e);
                throw;
            }
        }
示例#2
0
        private async Task <Peer> ConnectToPeer(IPEndPoint remoteEndPoint, bool isSeed)
        {
            try
            {
                var peer = new Peer(remoteEndPoint, isSeed, isIncoming: false);
                try
                {
                    this.unconnectedPeersLock.Do(() =>
                                                 this.unconnectedPeers.Remove(remoteEndPoint));
                    this.pendingPeers.TryAdd(peer);

                    await ConnectAndHandshake(peer);
                    await PeerStartup(peer);

                    PeerHandshakeCompleted?.Invoke(peer);

                    this.pendingPeers.TryRemove(peer);
                    this.connectedPeers.TryAdd(peer);

                    return(peer);
                }
                catch (Exception ex)
                {
                    logger.Debug(ex, $"Could not connect to {remoteEndPoint}");
                    DisconnectPeer(peer, ex);
                    return(null);
                }
            }
            catch (Exception)
            {
                this.badPeers.Add(remoteEndPoint); //TODO
                this.unconnectedPeersLock.Do(() =>
                                             this.unconnectedPeers.Remove(remoteEndPoint));
                throw;
            }
        }