Kontrola proxy nastaví SendTimeout = 200, zavolá Connect a čaká oveľa dlhšie, než sa očakávalo. Timeout je naviazaný na operáciu, ku ktorej kontrola ešte nedospela.

Socket.SendTimeout riadi synchrónne odosielanie. Nedáva synchrónnemu pokusu o pripojenie lehotu 200 ms. Pridanie spánku pred Connect pridá len ďalšie oneskorenie.

Zrušte operáciu, ktorá čaká

Na modernom cieli .NET, ktorý ponúka zrušiteľný overload, môže asynchrónny test uplatniť svoj rozpočet na nadviazanie spojenia:

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

Fragment patrí do asynchrónnej metódy, hostiteľa a port proxy dodáva volajúci; verejný kandidát zo zoznamu proxy môže dodať tieto dva vstupy. Zrušenie spracujte oddelene od chyby socketu, ak kontrola uvádza dôvody zlyhania. Uvoľnenie klienta tiež bráni tomu, aby dokončené testy hromadili sockety.

Starší kód .NET Framework nemá všetky moderné overloady. Použite podporované asynchrónne usporiadanie spojenia a pri opustení pokusu socket výslovne zatvorte. Samotné zastavenie vášho čakania nedokazuje, že sa podkladová operácia zastavila.

Zelený výsledok je stále malý výsledok

Úspešné TCP spojenie dokazuje, že tento klient dosiahol počúvajúci koncový bod. Nevyjednalo SOCKS, neautentizovalo sa pri HTTP proxy, neotvorilo CONNECT ani neprijalo požadovanú odpoveď webu.

Dajte týmto neskorším fázam vlastné obmedzené spracovanie alebo nimi preveďte zamýšľanú celkovú lehotu. Inak môže opravený časovač spojenia fungovať dokonale, kým kontrola strávi ďalšiu minútu čakaním na proxy handshake.

Súvisiace články