Klienti përfundon dërgimin, proxy shikon EOF dhe përgjigja zhduket. Mbyllja e menjëhershme e të dy socketeve të proxy-t mund të shkaktojë pikërisht atë sekuencë. Në një rele TCP, një fund i rregullt në një drejtim nuk do të thotë se drejtimi tjetër ka përfunduar.

Merrni parasysh një klient që dërgon një kërkesë, mbyll anën e dërgimit dhe pret përgjigjen:

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

Proxy-t ka dy lidhje TCP dhe dy rrjedha bajtësh që lëvizin në mënyrë të pavarur. Duhet ta çojë më tej treguesin e fundit të hyrjes, pasi të ketë çuar bajtët që i paraprijnë.

Zbrazni radhën përpara se të përcillni EOF

Në një marrje me madhësi jo zero në një rrjedhë TCP, kthimi i zeros tregon një fund të rregullt të asaj rrjedhe hyrëse. Shënoni atë drejtim leximi si të përfunduar. Ndaloni së prituri më shumë hyrje prej saj, por mbani bajtët e vendosur tashmë në radhë për socketin e kundërt.

Pasi radha nga klienti te shërbimi të zbrazet, thirrni shutdown(service_socket, SHUT_WR) në një socket POSIX. Kjo përfundon transmetimin e mëtejshëm drejt shërbimit, ndërsa drejtimi nga shërbimi te klienti mbetet i disponueshëm. Kur shërbimi përfundon përgjigjen e tij, zbatoni operacionin e pasqyruar pasi të zbrazni radhën e përgjigjes.

Mbyllja e përshkruesve i takon pikës ku të dy drejtimet dhe buferët e tyre në pritje kanë përfunduar, ose ku një gabim ose anulim kërkon përfundimin. Mbani një afat të kufizuar për një partner që nuk e përfundon kurrë gjysmën e mbetur.

Gatishmëria është ftesë për të lexuar

Një socket i lexueshëm mund të ketë të dhëna ose një gjendje EOF. Thirrni recv dhe interpretoni rezultatin. Numrat pozitivë janë bajtë për t'u përcjellë; zero është fundi i drejtimit. Në një socket jo-bllokues, EAGAIN ose EWOULDBLOCK do të thotë se aktualisht nuk ka më hyrje, ndërsa EINTR mund të kërkojë një provë të re. Asnjëri nuk është i njëjti ngjarje si EOF.

Mos kërkoni një flamur FIN në buferin e bajtëve të kthyer. TCP i dorëzon këtij API një rrjedhë të rregullt bajtësh; kufijtë e paketave dhe segmenti FIN nuk janë ngarkesë e zakonshme e aplikacionit.

Ky është cikli i jetës së një tuneli bajtësh të papërpunuar. Një proxy HTTP që analizon mesazhet duhet gjithsesi të respektojë kornizimin HTTP, dhe një proxy që përfundon TLS ka gjithashtu një protokoll mbylljeje TLS. Mbani ato vendime protokolli mbi relenë TCP të drejtuar.

Artikuj të ngjashëm