Socket.SendTimeout não limita uma tentativa de conexão proxy
Limite o teste da porta do proxy no estabelecimento da conexão em vez de definir um timeout que só se aplica ao envio de dados.
Um verificador de proxy define SendTimeout = 200, chama Connect e espera muito mais do que o esperado. O timeout está ligado a uma operação que o verificador ainda não alcançou.
Socket.SendTimeout controla os envios síncronos. Não dá a uma tentativa de conexão síncrona um prazo de 200 ms. Adicionar uma espera antes de Connect só acrescenta outro atraso.
Cancele a operação que está à espera
Num destino .NET moderno que oferece a sobrecarga cancelável, um teste assíncrono pode aplicar o seu orçamento ao estabelecimento da conexão:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
O fragmento pertence a um método async, com o host e a porta do proxy fornecidos pelo chamador; um candidato público de uma lista de proxies pode fornecer essas duas entradas. Trate o cancelamento separadamente de um erro de socket se o verificador indicar motivos de falha. Libertar o cliente também impede que os testes concluídos acumulem sockets.
O código .NET Framework mais antigo não tem todas as sobrecargas modernas. Use uma disposição de conexão assíncrona suportada e feche explicitamente o socket ao abandonar a tentativa. Apenas parar a sua espera não prova que uma operação subjacente parou.
O resultado verde continua a ser um resultado pequeno
Uma conexão TCP bem-sucedida prova que este cliente alcançou um endpoint à escuta. Não negociou SOCKS, não se autenticou num proxy HTTP, não abriu CONNECT nem recebeu a resposta desejada do site.
Dê a essas fases posteriores o seu próprio tratamento limitado, ou faça passar por elas um prazo global intencional. Caso contrário, o temporizador de conexão reparado pode funcionar na perfeição enquanto o verificador passa mais um minuto à espera de um handshake proxy.