TCP pusinio uždarymo perdavimas ištuštinus laukiančius baitus
Tvarkykite EOF TCP tarpinėje be duomenų eilėje praradimo ir be atsakymo kitame sraute nutraukimo.
Klientas baigia siųsti, tarpinė pamato EOF, ir atsakymas dingsta. Abiejų tarpinės lizdų uždarymas iš karto gali sukelti būtent šią seką. TCP rele tvarkinga pabaiga viena kryptimi nereiškia, kad kita kryptis baigėsi.
Panagrinėkime klientą, kuris išsiunčia užklausą, uždaro savo siuntimo pusę ir laukia atsakymo:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Tarpinė turi dvi TCP jungtis ir du nepriklausomai judančius baitų srautus. Ji turi perduoti įvesties pabaigos žymę toliau, po to kai perduoda prieš ją einančius baitus.
Ištuštinkite eilę prieš perduodami EOF
Kai TCP sraute gaunamas nulinio dydžio nesantis kiekis, nulio grąžinimas rodo tvarkingą to įeinančio srauto pabaigą. Pažymėkite tą skaitymo kryptį kaip baigtą. Nustokite laukti daugiau įvesties iš jos, bet išsaugokite baitus, jau įrašytus į eilę priešingam lizdui.
Kai eilė iš kliento į paslaugą ištuštėja, iškvieskite shutdown(service_socket, SHUT_WR) POSIX lizde. Tai užbaigia tolesnį perdavimą paslaugos link, palikdamas kryptį iš paslaugos į klientą pasiekiamą. Kai paslauga baigia savo atsakymą, pritaikykite veidrodinę operaciją ištuštinę atsakymo eilę.
Deskriptorių uždarymas priklauso tam momentui, kai abi kryptys ir jų laukiantys buferiai baigti, arba kai klaida ar atšaukimas reikalauja nutraukimo. Laikykite apribotą skirtąjį laiką partneriui, kuris niekada neužbaigia savo likusios pusės.
Pasirengimas yra kvietimas skaityti
Skaitomame lizde gali būti duomenų arba EOF būsena. Iškvieskite recv ir interpretuokite rezultatą. Teigiami skaičiai yra baitai, kuriuos reikia perduoti; nulis yra krypties pabaiga. Neablokuojančiame lizde EAGAIN arba EWOULDBLOCK reiškia, kad šiuo metu daugiau įvesties nėra, o EINTR gali reikalauti pakartoti. Nė vienas nėra tas pats įvykis kaip EOF.
Neieškokite FIN vėliavos grąžintame baitų buferyje. TCP pateikia šiai API tvarkingą baitų srautą; paketų ribos ir FIN segmentas nėra įprasta programos naudingoji apkrova.
Tai yra neapdoroto baitų tunelio gyvavimo ciklas. HTTP tarpinė, kuri analizuoja pranešimus, vis tiek turi gerbti HTTP rėminimą, o TLS užbaigianti tarpinė taip pat turi TLS uždarymo protokolą. Laikykite tuos protokolo sprendimus virš kryptinio TCP rele.