Předávání polouzavření TCP po vyprázdnění čekajících bajtů
Zpracujte EOF v TCP proxy bez ztráty dat ve frontě a bez přerušení odpovědi v opačném směru.
Klient dokončí odesílání, proxy uvidí EOF a odpověď zmizí. Okamžité zavření obou socketů proxy může způsobit právě tento sled. V TCP relé uspořádaný konec v jednom směru neznamená, že druhý směr skončil.
Uvažujme klienta, který odešle požadavek, vypne svou odesílací stranu a čeká na odpověď:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Proxy má dvě TCP spojení a dva nezávisle se pohybující bajtové proudy. Musí přenést dál označení konce vstupu poté, co přenese bajty, které mu předcházejí.
Před předáním EOF vyprázdněte frontu
U příjmu nenulové velikosti na TCP streamu návrat nuly značí uspořádaný konec tohoto příchozího streamu. Označte tento směr čtení za dokončený. Přestaňte čekat na další vstup z něj, ale ponechte bajty již zařazené do fronty pro opačný socket.
Jakmile se fronta klient–služba vyprázdní, zavolejte shutdown(service_socket, SHUT_WR) na socketu POSIX. Tím skončí další přenos směrem ke službě, zatímco směr služba–klient zůstane dostupný. Když služba dokončí svou odpověď, použijte zrcadlovou operaci po vyprázdnění fronty odpovědi.
Zavírání deskriptorů patří k bodu, kdy jsou dokončeny oba směry i jejich čekající buffery, nebo kdy chyba či zrušení vyžadují ukončení. Udržujte omezený timeout pro protějšek, který nikdy nedokončí svou zbývající polovinu.
Připravenost je pozvání ke čtení
Čitelný socket může mít data nebo stav EOF. Zavolejte recv a interpretujte výsledek. Kladné počty jsou bajty k předání; nula je směrový konec. Na neblokujícím socketu EAGAIN nebo EWOULDBLOCK znamená, že momentálně není další vstup, zatímco EINTR může vyžadovat opakování. Ani jedno není stejná událost jako EOF.
Nehledejte ve vráceném bajtovém bufferu příznak FIN. TCP této API dodává uspořádaný bajtový stream; hranice paketů a segment FIN nejsou běžná aplikační zátěž.
Toto je životní cyklus surového bajtového tunelu. HTTP proxy, která parsuje zprávy, musí stále respektovat rámcování HTTP, a proxy ukončující TLS má také protokol uzavření TLS. Udržujte tato protokolová rozhodnutí nad směrovým TCP relé.