Socket.SendTimeout ei rajoita välityspalvelinyhteyden yritystä
Rajoita välityspalvelimen portin tarkistus yhteyden muodostuksessa sen sijaan, että asettaisit timeoutin, joka koskee vain datan lähettämistä.
Välityspalvelimen tarkistaja asettaa SendTimeout = 200, kutsuu Connect ja odottaa paljon odotettua kauemmin. Timeout on kiinnitetty toimintoon, johon tarkistaja ei ole vielä päässyt.
Socket.SendTimeout ohjaa synkronisia lähetyksiä. Se ei anna synkroniselle yhteysyritykselle 200 ms:n määräaikaa. Unen lisääminen ennen Connectia lisää vain yhden viiveen lisää.
Peruuta odottava toiminto
Nykyaikaisessa .NET-kohteessa, joka tarjoaa peruutettavan ylikuormituksen, asynkroninen tarkistus voi kohdistaa budjettinsa yhteyden muodostukseen:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(2));
using var client = new TcpClient();
await client.ConnectAsync(proxyHost, proxyPort, budget.Token);
Katkelma kuuluu async-metodiin, ja välityspalvelimen isäntä ja portti tulevat kutsujalta; julkinen ehdokas välityspalvelinluettelosta voi tarjota nuo kaksi syötettä. Käsittele peruutus erillään socket-virheestä, jos tarkistaja ilmoittaa epäonnistumisen syyt. Asiakkaan vapauttaminen estää myös valmiita tarkistuksia keräämästä socketeja.
Vanhemmassa .NET Framework -koodissa ei ole kaikkia nykyaikaisia ylikuormituksia. Käytä tuettua asynkronista yhteysjärjestelyä ja sulje socket selvästi, kun luovut yrityksestä. Pelkkä odotuksen pysäyttäminen ei todista, että taustalla oleva toiminto on pysähtynyt.
Vihreä tulos on edelleen pieni tulos
Onnistunut TCP-yhteys todistaa, että tämä asiakas saavutti kuuntelevan päätepisteen. Se ei ole neuvotellut SOCKSeista, todennut itseään HTTP-välityspalvelimelle, avannut CONNECTia eikä vastaanottanut haluttua verkkosivun vastausta.
Anna noille myöhemmille vaiheille oma rajattu käsittelynsä tai kuljeta niiden läpi tarkoituksellinen kokonaismääräaika. Muuten korjattu yhteyden ajastin voi toimia täydellisesti, kun tarkistaja viettää vielä minuutin välityspalvelimen handshakea odottaen.