EOF:n käsittely Python SOCKS -lukusilmukassa
Käsittele EOF eksplisiittisesti SOCKS-tarkkalukusilmukassa sen sijaan, että pitäisit suljettua yhteyttä aikakatkaisuna, jota ei koskaan tule.
Silmukka haluaa kahdeksan tavua SOCKS-vastauksesta. Se on saanut kolme. Seuraava luku palauttaa b'', ja silmukka lisää sen, tarkistaa pituuden ja yrittää uudelleen loputtomasti.
Tämä on EOF:n käsittelyvirhe, ei hidas välityspalvelin, joka tarvitsee pidemmän aikakatkaisun. Normaalissa virtaavan socketin vastaanotossa tyhjä tavujono tarkoittaa, että vastapuoli on katkaissut yhteyden. Loput viisi tavua eivät saavu tuota yhteyttä pitkin.
Tarkkalukuapuri tarvitsee kolme erillistä lopputulosta: kerää ei-tyhjät osat, epäonnistu EOF:ssä ennen vaadittua pituutta ja välitä aikakatkaisu tai muu socket-virhe. Näitä tapauksia ei pitäisi sulauttaa yhdeksi yleiseksi uudelleenyrityssilmukaksi.
Aseta socketin aiottu aikakatkaisu ennen toimintoa ja lue välityspalvelimen protokollan määrittämät kenttäpituudet. Yksittäinen vastaanotto voi palauttaa vain osan vastauksesta. Toisaalta suuren kiinteän puskurin pyytäminen ei tee jokaisesta SOCKS-osoitteesta tuon pituista.
Älä korjaa riippuvuutta liittämällä vanhaa MSG_WAITALL-katkelmaa sen lähdekoodiin ja olettamalla, että se kattaa EOF:n, signaalit ja alustan käyttäytymisen. Suosi ylläpidetyn toteutuksen tuettua korjausta tai toteuta apurin sopimus tarkoituksella, kun jäsennin on omaa koodiasi.
Tallenna, montako tavua odotettiin ja vastaanotettiin, kirjaamatta tunnistetietojen hyötykuormia. ”EOF kolmen jälkeen kahdeksasta vastaustavusta” selittää rikkoutuneen vaihdon paljon paremmin kuin ”välityspalvelin jumiutui taas”.