public void DisconnectPeer(Peer peer, Exception ex)
{
if (ex != null)
logger.Debug(ex, $"Remote peer failed: {peer.RemoteEndPoint}");
PeerDisconnected?.Invoke(peer);
if (peer.IsIncoming)
Interlocked.Decrement(ref this.incomingCount);
this.badPeers.Add(peer.RemoteEndPoint); //TODO
this.unconnectedPeersLock.Do(() =>
this.unconnectedPeers.Remove(peer.RemoteEndPoint));
this.pendingPeers.TryRemove(peer);
this.connectedPeers.TryRemove(peer);
peer.OnDisconnect -= DisconnectPeer;
peer.Dispose();
}