// Disable CS0162: Unreachable code detected // // SuportsMultipleConnectAttempts is a constant; when false, the following lines will trigger CS0162. #pragma warning disable 162, 429 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, "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; }
// This is like a regular async callback worker, except the result can be an exception. This is a useful pattern when // processing should continue whether or not an async step failed. 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; }
internal IAsyncResult BeginConnect(IPAddress[] addresses, int port, AsyncCallback requestCallback, object state) { if (s_loggingEnabled) { Logging.Enter(Logging.Sockets, this, "BeginConnect", addresses); } if (CleanedUp) { throw new ObjectDisposedException(this.GetType().FullName); } if (addresses == null) { throw new ArgumentNullException("addresses"); } if (addresses.Length == 0) { throw new ArgumentException(SR.net_invalidAddressList, "addresses"); } if (!TcpValidationHelpers.ValidatePortNumber(port)) { throw new ArgumentOutOfRangeException("port"); } if (_addressFamily != AddressFamily.InterNetwork && _addressFamily != AddressFamily.InterNetworkV6) { throw new NotSupportedException(SR.net_invalidversion); } if (_isListening) { throw new InvalidOperationException(SR.net_sockets_mustnotlisten); } // Set up the result to capture the context. No need for a lock. MultipleAddressConnectAsyncResult result = new MultipleAddressConnectAsyncResult(addresses, port, this, state, requestCallback); result.StartPostingAsyncOp(false); if (DoMultipleAddressConnectCallback(PostOneBeginConnect(result), result)) { // If the call completes synchronously, invoke the callback from here. result.InvokeCallback(); } // Finished posting async op. Possibly will call callback. result.FinishPostingAsyncOp(ref Caches.ConnectClosureCache); if (s_loggingEnabled) { Logging.Exit(Logging.Sockets, this, "BeginConnect", result); } return result; }
private static bool DoDnsCallback(IAsyncResult result, MultipleAddressConnectAsyncResult context) { IPAddress[] addresses = DnsAPMExtensions.EndGetHostAddresses(result); context._addresses = addresses; return DoMultipleAddressConnectCallback(PostOneBeginConnect(context), context); }
// This is like a regular async callback worker, except the result can be an exception. This is a useful pattern when // processing should continue whether or not an async step failed. private static bool DoMultipleAddressConnectCallback(object result, MultipleAddressConnectAsyncResult context) { while (result != null) { Exception ex = result as Exception; if (ex == null) { try { context.socket.EndConnect((IAsyncResult) result); } catch (Exception exception) { ex = exception; } } if (ex == null) { // 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) 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; }
internal IAsyncResult BeginConnect(string host, int port, AsyncCallback requestCallback, object state) { if (s_loggingEnabled) { Logging.Enter(Logging.Sockets, this, "BeginConnect", host); } if (CleanedUp) { throw new ObjectDisposedException(this.GetType().FullName); } if (host == null) { throw new ArgumentNullException("host"); } if (!TcpValidationHelpers.ValidatePortNumber(port)) { throw new ArgumentOutOfRangeException("port"); } if (_addressFamily != AddressFamily.InterNetwork && _addressFamily != AddressFamily.InterNetworkV6) { throw new NotSupportedException(SR.net_invalidversion); } if (_isListening) { throw new InvalidOperationException(SR.net_sockets_mustnotlisten); } // Here, want to flow the context. No need to lock. MultipleAddressConnectAsyncResult result = new MultipleAddressConnectAsyncResult(null, port, this, state, requestCallback); result.StartPostingAsyncOp(false); IAsyncResult dnsResult = DnsAPMExtensions.BeginGetHostAddresses(host, new AsyncCallback(DnsCallback), result); if (dnsResult.CompletedSynchronously) { if (DoDnsCallback(dnsResult, result)) { result.InvokeCallback(); } } // Done posting. result.FinishPostingAsyncOp(ref Caches.ConnectClosureCache); if (s_loggingEnabled) { Logging.Exit(Logging.Sockets, this, "BeginConnect", result); } return result; }
public IAsyncResult BeginConnect(string host, int port, AsyncCallback requestCallback, object state) { if (NetEventSource.IsEnabled) NetEventSource.Enter(this, host); if (CleanedUp) { throw new ObjectDisposedException(this.GetType().FullName); } if (host == null) { throw new ArgumentNullException(nameof(host)); } if (!TcpValidationHelpers.ValidatePortNumber(port)) { throw new ArgumentOutOfRangeException(nameof(port)); } if (_addressFamily != AddressFamily.InterNetwork && _addressFamily != AddressFamily.InterNetworkV6) { throw new NotSupportedException(SR.net_invalidversion); } if (_isListening) { throw new InvalidOperationException(SR.net_sockets_mustnotlisten); } IPAddress parsedAddress; if (IPAddress.TryParse(host, out parsedAddress)) { IAsyncResult r = BeginConnect(parsedAddress, port, requestCallback, state); if (NetEventSource.IsEnabled) NetEventSource.Exit(this, r); return r; } ThrowIfNotSupportsMultipleConnectAttempts(); // Here, want to flow the context. No need to lock. MultipleAddressConnectAsyncResult result = new MultipleAddressConnectAsyncResult(null, port, this, state, requestCallback); result.StartPostingAsyncOp(false); IAsyncResult dnsResult = DnsAPMExtensions.BeginGetHostAddresses(host, new AsyncCallback(DnsCallback), result); if (dnsResult.CompletedSynchronously) { if (DoDnsCallback(dnsResult, result)) { result.InvokeCallback(); } } // Done posting. result.FinishPostingAsyncOp(ref Caches.ConnectClosureCache); if (NetEventSource.IsEnabled) NetEventSource.Exit(this, result); return result; }
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.GetString(SR.net_invalidAddressList), "context"); } try { EndPoint endPoint = new IPEndPoint(currentAddressSnapshot, context.port); // MSRC 11081 - Do the necessary security demand context.socket.CheckCacheRemote(ref endPoint, true); IAsyncResult connectResult = context.socket.UnsafeBeginConnect(endPoint, new AsyncCallback(MultipleAddressConnectCallback), context); if (connectResult.CompletedSynchronously) { return connectResult; } } catch (Exception exception) { if (exception is OutOfMemoryException || exception is StackOverflowException || exception is ThreadAbortException) throw; return exception; } return null; }
// This is like a regular async callback worker, except the result can be an exception. This is a useful pattern when // processing should continue whether or not an async step failed. private static void DoMultipleAddressConnectCallback(object result, MultipleAddressConnectAsyncResult context) { while (result != null) { Exception ex = result as Exception; if (ex == null) { try { context.socket.EndConnect((IAsyncResult) result); } catch (Exception exception) { if (exception is ThreadAbortException || exception is StackOverflowException || exception is OutOfMemoryException) throw; ex = exception; } catch { ex = new Exception(SR.GetString(SR.net_nonClsCompliantException)); } } if (ex == null) { context.InvokeCallback(); break; } else { if (++context.index >= context.addresses.Length) throw ex; context.lastException = ex; result = PostOneBeginConnect(context); } } }
private static object PostOneBeginConnect(MultipleAddressConnectAsyncResult context) { if (context.addresses[context.index].AddressFamily != context.socket.AddressFamily) { return context.lastException != null ? context.lastException : new ArgumentException(SR.GetString(SR.net_invalidAddressList), "context"); } try { IAsyncResult connectResult = context.socket.UnsafeBeginConnect(new IPEndPoint(context.addresses[context.index], context.port), new AsyncCallback(MultipleAddressConnectCallback), context); if (connectResult.CompletedSynchronously) { return connectResult; } } catch (Exception exception) { if (exception is OutOfMemoryException || exception is StackOverflowException || exception is ThreadAbortException) throw; return exception; } return null; }
private static void DoDnsCallback(IAsyncResult result, MultipleAddressConnectAsyncResult context) { IPAddress[] addresses = Dns.EndGetHostAddresses(result); context.addresses = addresses; DoMultipleAddressConnectCallback(PostOneBeginConnect(context), context); }
public IAsyncResult BeginConnect(IPAddress[] addresses, int port, AsyncCallback requestCallback, object state) { if (s_LoggingEnabled) { Logging.Enter(Logging.Sockets, this, "BeginConnect", addresses); } if (this.CleanedUp) { throw new ObjectDisposedException(base.GetType().FullName); } if (addresses == null) { throw new ArgumentNullException("addresses"); } if (addresses.Length == 0) { throw new ArgumentException(SR.GetString("net_invalidAddressList"), "addresses"); } if (!ValidationHelper.ValidateTcpPort(port)) { throw new ArgumentOutOfRangeException("port"); } if ((this.addressFamily != System.Net.Sockets.AddressFamily.InterNetwork) && (this.addressFamily != System.Net.Sockets.AddressFamily.InterNetworkV6)) { throw new NotSupportedException(SR.GetString("net_invalidversion")); } if (this.isListening) { throw new InvalidOperationException(SR.GetString("net_sockets_mustnotlisten")); } MultipleAddressConnectAsyncResult context = new MultipleAddressConnectAsyncResult(addresses, port, this, state, requestCallback); context.StartPostingAsyncOp(false); if (DoMultipleAddressConnectCallback(PostOneBeginConnect(context), context)) { context.InvokeCallback(); } context.FinishPostingAsyncOp(ref this.Caches.ConnectClosureCache); if (s_LoggingEnabled) { Logging.Exit(Logging.Sockets, this, "BeginConnect", context); } return context; }
public IAsyncResult BeginConnect(string host, int port, AsyncCallback requestCallback, object state) { if (s_LoggingEnabled) { Logging.Enter(Logging.Sockets, this, "BeginConnect", host); } if (this.CleanedUp) { throw new ObjectDisposedException(base.GetType().FullName); } if (host == null) { throw new ArgumentNullException("host"); } if (!ValidationHelper.ValidateTcpPort(port)) { throw new ArgumentOutOfRangeException("port"); } if ((this.addressFamily != System.Net.Sockets.AddressFamily.InterNetwork) && (this.addressFamily != System.Net.Sockets.AddressFamily.InterNetworkV6)) { throw new NotSupportedException(SR.GetString("net_invalidversion")); } if (this.isListening) { throw new InvalidOperationException(SR.GetString("net_sockets_mustnotlisten")); } MultipleAddressConnectAsyncResult result = new MultipleAddressConnectAsyncResult(null, port, this, state, requestCallback); result.StartPostingAsyncOp(false); IAsyncResult result2 = Dns.UnsafeBeginGetHostAddresses(host, new AsyncCallback(Socket.DnsCallback), result); if (result2.CompletedSynchronously && DoDnsCallback(result2, result)) { result.InvokeCallback(); } result.FinishPostingAsyncOp(ref this.Caches.ConnectClosureCache); if (s_LoggingEnabled) { Logging.Exit(Logging.Sockets, this, "BeginConnect", result); } return result; }
private static object PostOneBeginConnect(MultipleAddressConnectAsyncResult context) { IPAddress address = context.addresses[context.index]; if (address.AddressFamily != context.socket.AddressFamily) { if (context.lastException == null) { return new ArgumentException(SR.GetString("net_invalidAddressList"), "context"); } return context.lastException; } try { EndPoint remoteEP = new IPEndPoint(address, context.port); context.socket.CheckCacheRemote(ref remoteEP, true); IAsyncResult result = context.socket.UnsafeBeginConnect(remoteEP, new AsyncCallback(Socket.MultipleAddressConnectCallback), context); if (result.CompletedSynchronously) { return result; } } catch (Exception exception) { if (((exception is OutOfMemoryException) || (exception is StackOverflowException)) || (exception is ThreadAbortException)) { throw; } return exception; } return null; }
private static bool DoMultipleAddressConnectCallback(object result, MultipleAddressConnectAsyncResult context) { while (result != null) { Exception exception = result as Exception; if (exception == null) { try { context.socket.EndConnect((IAsyncResult) result); } catch (Exception exception2) { exception = exception2; } } if (exception == null) { return true; } if (++context.index >= context.addresses.Length) { throw exception; } context.lastException = exception; result = PostOneBeginConnect(context); } return false; }