EOF apdorojimas Python SOCKS skaitymo cikle
Tvarkykite EOF aiškiai SOCKS tikslaus skaitymo cikle, o ne laikykite uždaryto ryšio skirtuoju laiku, kuris niekada neateina.
Ciklas nori aštuonių SOCKS atsakymo baitų. Jis gavo tris. Kitas skaitymas grąžina b'', ciklas jį prideda, patikrina ilgį ir bando dar kartą be galo.
Tai EOF tvarkymo klaida, o ne lėtas proxy, kuriam reikia ilgesnio skirtojo laiko. Įprastame srauto lizdo priėmime tuščia baitų eilutė reiškia, kad kita pusė atsijungė. Likę penki baitai šiuo ryšiu neatkeliaus.
Tikslaus skaitymo pagalbininkui reikia trijų skirtingų rezultatų: kaupti netuščius fragmentus, nepavykti ties EOF prieš reikiamą ilgį ir perduoti skirtąjį laiką ar kitą lizdo klaidą. Šie atvejai neturėtų susilieti į vieną bendrą pakartojimo ciklą.
Nustatykite numatomą lizdo skirtąjį laiką prieš operaciją ir skaitykite lauko ilgius, kuriuos nurodo proxy protokolas. Vienas priėmimas gali grąžinti tik dalį atsakymo. Priešingai, prašymas didelio fiksuoto buferio nepadaro kiekvieno SOCKS adreso tokio ilgio.
Netaisykite priklausomybės įklijuodami seną MSG_WAITALL fragmentą į jos šaltinį ir manydami, kad jis apima EOF, signalus ir platformos elgseną. Pirmenybę teikite palaikomo įgyvendinimo palaikomam taisymui arba, kai analizatorius yra jūsų kodas, sąmoningai įgyvendinkite pagalbininko sutartį.
Išsaugokite, kiek baitų buvo tikėtasi ir gauta, neregistruodami prisijungimo duomenų. „EOF po trijų iš aštuonių atsakymo baitų“ paaiškina sugedusį mainus daug geriau nei „proxy vėl užstrigo“.