Socket.SendTimeout non limita un intento de conexión de proxy
Limite a proba do porto do proxy no establecemento da conexión en lugar de definir un timeout que só se aplica ao envío de datos.
Un verificador de proxy define SendTimeout = 200, chama Connect e espera moito máis do previsto. O timeout está ligado a unha operación á que o verificador aínda non chegou.
Socket.SendTimeout controla os envíos sincrónicos. Non dá a un intento de conexión sincrónico un prazo de 200 ms. Engadir unha espera antes de Connect só engade outro atraso.
Cancele a operación que está esperando
Nun destino .NET moderno que ofrece a sobrecarga cancelable, unha proba asíncrona pode aplicar o seu orzamento ao establecemento da conexión:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
O fragmento pertence a un método async, co host e o porto do proxy fornecidos polo chamador; un candidato público dunha lista de proxies pode fornecer esas dúas entradas. Trate a cancelación por separado dun erro de socket se o verificador informa de motivos de fallo. Liberar o cliente tamén evita que as probas completadas acumulen sockets.
O código antigo de .NET Framework non ten todas as sobrecargas modernas. Use unha disposición de conexión asíncrona compatible e peche explicitamente o socket ao abandonar o intento. Deterse só a súa espera non demostra que unha operación subxacente se detivese.
O resultado verde segue sendo un resultado pequeno
Unha conexión TCP correcta demostra que este cliente chegou a un extremo que escoita. Non negociou SOCKS, non se autenticou nun proxy HTTP, non abriu CONNECT nin recibiu a resposta do sitio web desexada.
Dea a esas etapas posteriores o seu propio tratamento limitado, ou faga pasar por elas un prazo global intencionado. Doutro xeito, o temporizador de conexión reparado pode funcionar perfectamente mentres o verificador pasa outro minuto esperando un handshake de proxy.