A TCP féllezárás továbbítása a várakozó bájtok kiürítése után
Kezelje az EOF-ot egy TCP-proxyban anélkül, hogy eldobná a sorban álló adatokat, vagy elvágná a választ a másik irányban.
A kliens befejezi a küldést, a proxy EOF-ot lát, és a válasz eltűnik. Mindkét proxy-socket azonnali lezárása pontosan ezt a sorrendet okozhatja. Egy TCP-relében az egyik irány rendezett vége nem jelenti azt, hogy a másik irány befejeződött.
Vegyünk egy klienst, amely kérést küld, lezárja a küldő oldalát, és várja a választ:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
A proxynek két TCP-kapcsolata és két egymástól függetlenül mozgó bájtfolyama van. A bemenet végét jelző jelzést tovább kell vinnie, miután továbbvitte az őt megelőző bájtokat.
Ürítse ki a sort az EOF továbbítása előtt
Egy TCP-folyamon végzett nem nulla méretű fogadásnál a nulla visszatérése a bejövő folyam rendezett végét jelzi. Jelölje ezt az olvasási irányt befejezettnek. Ne várjon további bemenetre tőle, de tartsa meg a szemközti sockethez már sorba állított bájtokat.
Amikor a kliens–szolgáltatás sor kiürült, hívja meg a shutdown(service_socket, SHUT_WR) műveletet egy POSIX-socketen. Ez lezárja a szolgáltatás felé irányuló további átvitelt, miközben a szolgáltatás–kliens irány elérhető marad. Amikor a szolgáltatás befejezi a válaszát, a válaszsor kiürítése után alkalmazza a tükrözött műveletet.
A leírók lezárása ahhoz a ponthoz tartozik, ahol mindkét irány és a várakozó puffereik befejeződtek, vagy ahol egy hiba vagy megszakítás befejezést kíván. Tartson korlátozott időtúllépést egy olyan partner számára, amely soha nem fejezi be a fennmaradó felét.
A készenlét olvasásra szóló meghívás
Egy olvasható socket tartalmazhat adatot vagy EOF-állapotot. Hívja meg a recv-et, és értelmezze az eredményt. A pozitív számok továbbítandó bájtok; a nulla az irány vége. Egy nem blokkoló socketen az EAGAIN vagy az EWOULDBLOCK azt jelenti, hogy jelenleg nincs több bemenet, míg az EINTR újrapróbálkozást igényelhet. Egyik sem ugyanaz az esemény, mint az EOF.
Ne keressen FIN-jelzőt a visszaadott bájtpufferben. A TCP rendezett bájtfolyamot szállít ennek az API-nak; a csomaghatárok és a FIN-szegmens nem szokványos alkalmazási hasznos teher.
Ez egy nyers bájtalagút életciklusa. Az üzeneteket elemző HTTP-proxynak továbbra is tiszteletben kell tartania a HTTP-keretezést, a TLS-t lezáró proxynak pedig TLS-lezárási protokollja is van. Tartsa ezeket a protokoll-döntéseket az irányított TCP-relé fölött.