Sprawdzarka proxy ustawia SendTimeout = 200, wywołuje Connect i czeka znacznie dłużej niż oczekiwano. Limit czasu jest powiązany z operacją, do której sprawdzarka jeszcze nie dotarła.

Socket.SendTimeout kontroluje synchroniczne wysyłanie. Nie daje synchronicznej próbie połączenia terminu 200 ms. Dodanie uśpienia przed Connect dodaje tylko kolejne opóźnienie.

Anuluj oczekującą operację

W nowoczesnym środowisku .NET oferującym anulowalne przeciążenie asynchroniczny test może zastosować swój budżet na nawiązanie połączenia:

using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);

Fragment należy do metody async, a host i port proxy podaje wywołujący; publiczny kandydat z listy proxy może dostarczyć te dwa wejścia. Anulowanie obsługuj osobno od błędu gniazda, jeśli sprawdzarka podaje przyczyny niepowodzenia. Zwolnienie klienta zapobiega też gromadzeniu gniazd przez zakończone testy.

Starszy kod .NET Framework nie ma wszystkich nowoczesnych przeciążeń. Użyj obsługiwanego asynchronicznego układu połączenia i jawnie zamknij gniazdo, gdy porzucasz próbę. Samo zatrzymanie oczekiwania nie dowodzi, że operacja bazowa się zatrzymała.

Zielony wynik to nadal mały wynik

Udane połączenie TCP dowodzi, że ten klient dotarł do nasłuchującego punktu końcowego. Nie wynegocjowało SOCKS, nie uwierzytelniło się w proxy HTTP, nie otworzyło CONNECT ani nie otrzymało żądanej odpowiedzi witryny.

Daj tym późniejszym etapom własną ograniczoną obsługę albo przeprowadź przez nie zamierzony całkowity termin. W przeciwnym razie naprawiony licznik czasu połączenia może działać bezbłędnie, podczas gdy sprawdzarka spędza kolejną minutę na oczekiwaniu na uścisk dłoni proxy.

Powiązane artykuły