Socket.SendTimeout no limita un intento de conexión de proxy
Acote la prueba del puerto del proxy en el establecimiento de la conexión en lugar de fijar un timeout que solo se aplica al envío de datos.
Un verificador de proxy establece SendTimeout = 200, llama a Connect y espera mucho más de lo previsto. El timeout está asociado a una operación a la que el verificador aún no ha llegado.
Socket.SendTimeout controla los envíos sincrónicos. No da a un intento de conexión sincrónico un plazo de 200 ms. Añadir una espera antes de Connect solo agrega otro retraso.
Cancele la operación que está esperando
En un destino .NET moderno que ofrece la sobrecarga cancelable, una prueba asíncrona puede aplicar su presupuesto al establecimiento de la conexión:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
El fragmento pertenece a un método async, con el host y el puerto del proxy proporcionados por el llamador; un candidato público de una lista de proxies puede aportar esas dos entradas. Trate la cancelación por separado de un error de socket si el verificador informa motivos de fallo. Liberar el cliente también evita que las pruebas completadas acumulen sockets.
El código antiguo de .NET Framework no tiene todas las sobrecargas modernas. Utilice una disposición de conexión asíncrona compatible y cierre explícitamente el socket al abandonar el intento. Detener solo su espera no demuestra que una operación subyacente se haya detenido.
El resultado verde sigue siendo un resultado pequeño
Una conexión TCP correcta demuestra que este cliente alcanzó un extremo que escucha. No ha negociado SOCKS, no se ha autenticado ante un proxy HTTP, no ha abierto CONNECT ni ha recibido la respuesta del sitio web deseada.
Dé a esas etapas posteriores su propio tratamiento acotado, o haga pasar por ellas un plazo global intencionado. De lo contrario, el temporizador de conexión reparado puede funcionar a la perfección mientras el verificador pasa otro minuto esperando un handshake de proxy.