Natapos nang magpadala ang kliyente, nakita ng proxy ang EOF, at nawala ang tugon. Ang agarang pagsasara ng dalawang socket ng proxy ay maaaring magdulot ng eksaktong pagkakasunod-sunod na iyon. Sa isang TCP relay, ang maayos na pagtatapos sa isang direksyon ay hindi nangangahulugang tapos na ang kabilang direksyon.

Isaalang-alang ang isang kliyenteng nagpapadala ng kahilingan, nagsasara ng panig ng pagpapadala at naghihintay ng sagot:

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

Ang proxy ay may dalawang koneksyon ng TCP at dalawang daloy ng byte na gumagalaw nang magkahiwalay. Kailangan nitong ipagpatuloy ang hudyat ng dulo ng input pagkatapos ipagpatuloy ang mga byte na nauuna rito.

Ubusing ang pila bago ipadala ang EOF

Sa isang pagtanggap na hindi zero ang laki sa isang TCP stream, ang pagbabalik ng zero ay nagpapahiwatig ng maayos na pagtatapos ng papasok na stream na iyon. Markahan ang direksyong iyon ng pagbasa bilang tapos na. Itigil ang paghihintay ng higit pang input mula rito, ngunit panatilihin ang mga byte na nakapila na para sa kabilang socket.

Kapag naubos na ang pila mula kliyente patungong serbisyo, tawagan ang shutdown(service_socket, SHUT_WR) sa isang POSIX socket. Tinatapos nito ang karagdagang paghahatid patungo sa serbisyo habang nananatiling available ang direksyon mula serbisyo patungong kliyente. Kapag natapos na ng serbisyo ang tugon nito, ilapat ang salamin na operasyon pagkatapos maubos ang pila ng tugon.

Ang pagsasara ng mga deskriptor ay kabilang sa puntong tapos na ang dalawang direksyon at ang mga nakabinbing buffer ng mga ito, o kung saan kailangan ng error o pagkansela ang pagtatapos. Panatilihin ang may hangganang timeout para sa isang kapareha na hindi kailanman nakukumpleto ang natitirang kalahati.

Ang kahandaan ay isang imbitasyon na magbasa

Ang isang nababasang socket ay maaaring may data o isang kondisyon ng EOF. Tawagan ang recv at bigyang-kahulugan ang resulta. Ang mga positibong bilang ay mga byte na ipapadala; ang zero ay ang dulo ng direksyon. Sa isang nonblocking socket, ang EAGAIN o EWOULDBLOCK ay nangangahulugang wala nang input sa ngayon, habang ang EINTR ay maaaring mangailangan ng muling pagsubok. Wala sa dalawa ang parehong pangyayari gaya ng EOF.

Huwag hanapin ang bandila ng FIN sa ibinalik na buffer ng byte. Ang TCP ay naghahatid ng maayos na stream ng byte sa API na ito; ang mga hangganan ng packet at ang segment ng FIN ay hindi ordinaryong payload ng aplikasyon.

Ito ang siklo ng buhay ng isang hilaw na tunnel ng byte. Ang isang HTTP proxy na nag-parse ng mga mensahe ay kailangan pa ring igalang ang pag-frame ng HTTP, at ang isang proxy na nagtatapos ng TLS ay mayroon ding protocol ng pagsasara ng TLS. Panatilihin ang mga desisyon sa protocol na iyon sa itaas ng direksyonal na TCP relay.

Kaugnay na mga artikulo