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