Stuur TCP-halfsluitings aan nadat die hangende grepe uitgeput is
Hanteer EOF in 'n TCP-proxy sonder om tougestelde data te laat val of die antwoord in die ander rigting af te sny.
Die kliënt maak klaar met stuur, die proxy sien EOF, en die antwoord verdwyn. Om albei proxy-sokke onmiddellik te sluit kan presies daardie volgorde veroorsaak. In 'n TCP-relais beteken 'n ordelike einde in een rigting nie dat die ander rigting klaar is nie.
Oorweeg 'n kliënt wat 'n versoek stuur, sy stuurkaart sluit en op die antwoord wag:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Die proxy het twee TCP-verbindings en twee greepstrome wat onafhanklik beweeg. Dit moet die aanduiding van einde-van-insette verder dra, nadat dit die grepe wat dit voorafgaan gedra het.
Tap die tou uit voordat EOF aangestuur word
Vir 'n ontvangs van nie-nul grootte op 'n TCP-stroom dui 'n terugkeer van nul op 'n ordelike einde van daardie inkomende stroom. Merk daardie leesrigting as voltooi. Hou op wag vir meer insette daarvan, maar behou grepe wat reeds vir die teenoorgestelde sok in die tou is.
Sodra die kliënt-na-diens-tou uitgeput is, roep shutdown(service_socket, SHUT_WR) op 'n POSIX-sok. Dit beëindig verdere versending na die diens terwyl die diens-na-kliënt-rigting beskikbaar bly. Wanneer die diens sy antwoord voltooi, pas die spieëloperasie toe nadat die antwoordtou uitgeput is.
Die sluit van die deskriptors hoort by die punt waar albei rigtings en hul hangende buffers klaar is, of waar 'n fout of kansellasie beëindiging vereis. Hou 'n begrensde tydsbeperking vir 'n eweknie wat nooit sy oorblywende helfte voltooi nie.
Gereedheid is 'n uitnodiging om te lees
'n Leesbare sok kan data of 'n EOF-toestand hê. Roep recv en interpreteer die resultaat. Positiewe tellings is grepe om aan te stuur; nul is die rigting-einde. Op 'n nie-blokkerende sok beteken EAGAIN of EWOULDBLOCK dat daar tans geen verdere insette is nie, terwyl EINTR dalk herprobeer vereis. Nie een is dieselfde gebeurtenis as EOF nie.
Moenie die teruggekeerde grepebuffer vir 'n FIN-vlag deursoek nie. TCP lewer 'n geordende greepstroom aan hierdie API; pakketgrense en die FIN-segment is nie gewone toepassingsnuttelading nie.
Dit is die lewensiklus van 'n rou grepetonnel. 'n HTTP-proxy wat boodskappe ontleed, moet steeds HTTP-raamwerk respekteer, en 'n TLS-beëindigende proxy het ook 'n TLS-afsluitprotokol. Hou daardie protokolbesluite bo die rigting-TCP-relais.