Socket.SendTimeout ne limite pas une tentative de connexion via proxy
Borné le test du port du proxy à l’établissement de la connexion au lieu de définir un timeout qui ne s’applique qu’à l’envoi de données.
Un vérificateur de proxy définit SendTimeout = 200, appelle Connect et attend bien plus longtemps que prévu. Le timeout est rattaché à une opération que le vérificateur n’a pas encore atteinte.
Socket.SendTimeout contrôle les envois synchrones. Il ne donne pas à une tentative de connexion synchrone un délai de 200 ms. Ajouter une pause avant Connect ne fait qu’ajouter un retard de plus.
Annulez l’opération qui attend
Sur une cible .NET moderne fournissant la surcharge annulable, un test asynchrone peut appliquer son budget à l’établissement de la connexion :
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
Le fragment appartient à une méthode async, l’hôte et le port du proxy étant fournis par l’appelant ; un candidat public issu d’une liste de proxies peut fournir ces deux entrées. Traitez l’annulation séparément d’une erreur de socket si le vérificateur indique des motifs d’échec. Libérer le client évite aussi aux tests terminés d’accumuler des sockets.
Le code .NET Framework plus ancien ne dispose pas de toutes les surcharges modernes. Utilisez une disposition de connexion asynchrone prise en charge et fermez explicitement le socket lorsque vous abandonnez la tentative. Le simple arrêt de votre attente ne prouve pas qu’une opération sous-jacente s’est arrêtée.
Le résultat vert reste un petit résultat
Une connexion TCP réussie prouve que ce client a atteint un point de terminaison en écoute. Il n’a pas négocié SOCKS, ne s’est pas authentifié auprès d’un proxy HTTP, n’a pas ouvert CONNECT ni reçu la réponse attendue du site.
Donnez à ces étapes ultérieures leur propre traitement borné, ou faites-leur porter une échéance globale volontaire. Sinon, la minuterie de connexion réparée peut fonctionner parfaitement pendant que le vérificateur passe une minute de plus à attendre une poignée de main proxy.