Klient dokončí odosielanie, proxy uvidí EOF a odpoveď zmizne. Okamžité zatvorenie oboch socketov proxy môže spôsobiť presne tento sled. V TCP relé usporiadaný koniec v jednom smere neznamená, že druhý smer skončil.

Uvažujme klienta, ktorý odošle požiadavku, vypne svoju odosielaciu stranu a čaká na odpoveď:

client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service

Proxy má dve TCP spojenia a dva nezávisle sa pohybujúce bajtové prúdy. Musí preniesť ďalej označenie konca vstupu po tom, čo preniesol bajty, ktoré mu predchádzajú.

Pred preposlaním EOF vyprázdnite front

Pri príjme nenulovej veľkosti na TCP streame návrat nuly znamená usporiadaný koniec tohto prichádzajúceho streamu. Označte tento smer čítania za dokončený. Prestaňte čakať na ďalší vstup z neho, ale ponechajte bajty už zaradené do frontu pre opačný socket.

Keď sa front klient–služba vyprázdni, zavolajte shutdown(service_socket, SHUT_WR) na sockete POSIX. Tým sa skončí ďalší prenos smerom k službe, pričom smer služba–klient zostane dostupný. Keď služba dokončí svoju odpoveď, použite zrkadlovú operáciu po vyprázdnení frontu odpovede.

Zatváranie deskriptorov patrí k bodu, keď sú dokončené oba smery aj ich čakajúce buffery, alebo keď chyba či zrušenie vyžadujú ukončenie. Udržujte obmedzený časový limit pre partnera, ktorý nikdy nedokončí svoju zostávajúcu polovicu.

Pripravenosť je pozvanie čítať

Čitateľný socket môže mať dáta alebo stav EOF. Zavolajte recv a interpretujte výsledok. Kladné počty sú bajty na preposlanie; nula je smerový koniec. Na neblokujúcom sockete EAGAIN alebo EWOULDBLOCK znamená, že momentálne nie je ďalší vstup, zatiaľ čo EINTR môže vyžadovať opakovanie. Ani jedno nie je tá istá udalosť ako EOF.

Nehľadajte príznak FIN vo vrátenom bajtovom buffere. TCP dodáva tomuto API usporiadaný bajtový stream; hranice paketov a segment FIN nie sú bežnou aplikačnou záťažou.

Toto je životný cyklus surového bajtového tunela. HTTP proxy, ktorá parsuje správy, musí stále rešpektovať rámcovanie HTTP, a proxy ukončujúca TLS má aj protokol uzavretia TLS. Udržujte tieto protokolové rozhodnutia nad smerovým TCP relé.

Súvisiace články