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; } }
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; } }