private static object PostOneBeginConnect(MultipleAddressConnectAsyncResult context)
{
IPAddress currentAddressSnapshot = context._addresses[context._index];
if (!context._socket.CanTryAddressFamily(currentAddressSnapshot.AddressFamily))
{
return context._lastException != null ? context._lastException : new ArgumentException(SR.net_invalidAddressList, nameof(context));
}
try
{
EndPoint endPoint = new IPEndPoint(currentAddressSnapshot, context._port);
// Do the necessary security demand.
context._socket.CheckCacheRemote(ref endPoint, true);
Socket connectSocket = context._socket;
if (!SocketPal.SupportsMultipleConnectAttempts && !context._isUserConnectAttempt)
{
context._lastAttemptSocket = new Socket(context._socket._addressFamily, context._socket._socketType, context._socket._protocolType);
if (context._socket.IsDualMode)
{
context._lastAttemptSocket.DualMode = true;
}
connectSocket = context._lastAttemptSocket;
}
IAsyncResult connectResult = connectSocket.UnsafeBeginConnect(endPoint, CachedMultipleAddressConnectCallback, context);
if (connectResult.CompletedSynchronously)
{
return connectResult;
}
}
catch (Exception exception)
{
if (exception is OutOfMemoryException)
{
throw;
}
return exception;
}
return null;
}