Kupeleka Nusu-Kufunga kwa TCP Baada ya Kumaliza Baiti Zinazosubiri
Shughulikia EOF katika proksi ya TCP bila kupoteza data iliyo kwenye foleni au kukata jibu upande mwingine.
Mteja anamaliza kutuma, proksi inaona EOF, na jibu linatoweka. Kufunga soketi zote mbili za proksi mara moja kunaweza kusababisha mfululizo huo hasa. Katika relay ya TCP, mwisho ulio wa mpangilio upande mmoja haumaanishi upande mwingine umeisha.
Fikiria mteja anayetuma ombi, anafunga upande wake wa kutuma na kusubiri jibu:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Proksi ina miunganisho miwili ya TCP na mitiririko miwili ya baiti inayosonga kwa kujitegemea. Inapaswa kupeleka ishara ya mwisho wa ingizo mbele, baada ya kupeleka baiti zinazoitangulia.
Maliza foleni kabla ya kupeleka EOF
Katika upokeaji wa ukubwa usio sifuri kwenye mtiririko wa TCP, kurudi kwa sifuri kunaonyesha mwisho ulio wa mpangilio wa mtiririko huo unaoingia. Weka alama upande huo wa kusoma kama umekamilika. Acha kusubiri ingizo zaidi kutoka kwake, lakini hifadhi baiti zilizokwisha kuwekwa kwenye foleni kwa soketi pinzani.
Foleni ya mteja-hadi-huduma ikishamalizika, ita shutdown(service_socket, SHUT_WR) kwenye soketi ya POSIX. Hiyo inamaliza usambazaji zaidi kuelekea huduma huku ikiacha upande wa huduma-hadi-mteja upatikane. Huduma inapomaliza jibu lake, tumia operesheni ya kioo baada ya kumaliza foleni ya jibu.
Kufunga vidokezi ni kwa wakati ambapo pande zote mbili na bafa zao zinazosubiri zimekamilika, au pale hitilafu au kughairi kunahitaji kusitisha. Weka muda maalum wenye kikomo kwa mwenzake ambaye hukamilishi nusu yake iliyobaki.
Utayari ni mwaliko wa kusoma
Soketi inayoweza kusomeka inaweza kuwa na data au hali ya EOF. Ita recv na tafsiri matokeo. Hesabu chanya ni baiti za kupeleka; sifuri ni mwisho wa upande. Kwenye soketi isiyozuia, EAGAIN au EWOULDBLOCK inamaanisha hakuna ingizo zaidi kwa sasa, wakati EINTR inaweza kuhitaji kujaribu tena. Hakuna kati yao ni tukio lile lile kama EOF.
Usitafute bendera ya FIN kwenye bafa ya baiti iliyorudishwa. TCP huwasilisha mtiririko wa baiti ulio wa mpangilio kwa API hii; mipaka ya pakiti na sehemu ya FIN si mzigo wa kawaida wa programu.
Huu ni mzunguko wa maisha wa handaki mbichi ya baiti. Proksi ya HTTP inayochanganua ujumbe bado inapaswa kuheshimu uwekaji wa fremu wa HTTP, na proksi inayomaliza TLS pia ina itifaki ya kufunga TLS. Weka maamuzi hayo ya itifaki juu ya relay ya TCP yenye mwelekeo.