De klant is klear mei stjoeren, de proxy sjocht EOF, en it antwurd ferdwynt. Beide proxy-sockets fuortdaliks slute kin krekt dy folchoarder feroarsaakje. Yn in TCP-relay betsjut in oardlik ein yn ien rjochting net dat de oare rjochting klear is.

Tink oan in klant dy't in fersyk stjoert, syn stjoerkant slút en op it antwurd wachtet:

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

De proxy hat twa TCP-ferbiningen en twa bytestreams dy't ûnôfhinklik bewege. Hy moat de oantsjutting fan it ein fan de ynput trochjaan, nei't er de bytes trochjûn hat dy't dêroan foarôfgeane.

Leegje de wachtrige foardat EOF trochjûn wurdt

By in ûntfangst fan net-nul grutte op in TCP-stream betsjut in weromjefte fan nul in oardlik ein fan dy ynkommende stream. Markearje dy lêsrjochting as klear. Stop mei wachtsjen op mear ynput derfan, mar behâld bytes dy't al yn 'e rige steane foar de oare socket.

Sadree't de rige fan klant nei tsjinst leech is, rop shutdown(service_socket, SHUT_WR) op in POSIX-socket. Dat einiget fierdere oerdracht nei de tsjinst, wylst de rjochting fan tsjinst nei klant beskikber bliuwt. As de tsjinst syn antwurd klear hat, pas dan de spegele operaasje ta nei it leegjen fan 'e antwurdrige.

It sluten fan de beskriuwers heart by it punt dêr't beide rjochtingen en har wachtbuffers klear binne, of dêr't in flater of annulearring beëiniging easket. Hâld in beheinde tiidlimyt foar in peir dat syn oerbleaune helte nea foltôget.

Gereedheid is in útnûging om te lêzen

In lêsbere socket kin data of in EOF-tastân hawwe. Rop recv en ynterpretearje it resultaat. Positieve oantallen binne bytes om troch te jaan; nul is it rjochtingseine. Op in net-blokkearjende socket betsjut EAGAIN of EWOULDBLOCK dat der op it stuit gjin fierdere ynput is, wylst EINTR weromprobeare kin fereaskje. Gjin fan beide is itselde barren as EOF.

Sykje net nei in FIN-flagge yn 'e weromjûne bytebuffer. TCP leveret in oardlike bytestream oan dizze API; pakketgrinzen en it FIN-segment binne gjin gewoane applikaasjelading.

Dit is de libbenssyklus fan in rau bytetunnel. In HTTP-proxy dy't berjochten parset moat noch altyd HTTP-raming respektearje, en in TLS-beëinigjende proxy hat ek in TLS-slútprotokol. Hâld dy protokolbesluten boppe de rjochting-TCP-relay.

Relatearre artikelen