private static bool DoMultipleAddressConnectCallback(object result, MultipleAddressConnectAsyncResult context)
{
while (result != null)
{
Exception ex = result as Exception;
if (ex == null)
{
try
{
if (SocketPal.SupportsMultipleConnectAttempts || context._isUserConnectAttempt)
{
context._socket.EndConnect((IAsyncResult)result);
}
else
{
Debug.Assert(context._lastAttemptSocket != null);
context._lastAttemptSocket.EndConnect((IAsyncResult)result);
}
}
catch (Exception exception)
{
ex = exception;
}
}
if (!SocketPal.SupportsMultipleConnectAttempts && !context._isUserConnectAttempt && context._lastAttemptSocket != null)
{
context._lastAttemptSocket.Dispose();
}
if (ex == null)
{
if (!SocketPal.SupportsMultipleConnectAttempts && !context._isUserConnectAttempt)
{
context._isUserConnectAttempt = true;
result = PostOneBeginConnect(context);
}
else
{
// Don't invoke the callback from here, because we're probably inside
// a catch-all block that would eat exceptions from the callback.
// Instead tell our caller to invoke the callback outside of its catchall.
return true;
}
}
else
{
if (++context._index >= context._addresses.Length || context._isUserConnectAttempt)
{
throw ex;
}
context._lastException = ex;
result = PostOneBeginConnect(context);
}
}
// Don't invoke the callback at all, because we've posted another async connection attempt.
return false;
}
#pragma warning restore