Klients pabeidz sūtīšanu, starpnieks redz EOF, un atbilde pazūd. Abu starpnieka ligzdu tūlītēja aizvēršana var izraisīt tieši šo secību. TCP relejā sakārtotas beigas vienā virzienā nenozīmē, ka otrs virziens ir beidzies.

Apsveriet klientu, kas nosūta pieprasījumu, aizver savu sūtīšanas pusi un gaida atbildi:

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

Starpniekam ir divi TCP savienojumi un divas neatkarīgi kustīgas baitu plūsmas. Tam jāpārsūta ievades beigu norāde tālāk, pēc tam kad pārsūtīti tai priekšā esošie baiti.

Iztukšojiet rindu pirms EOF pārsūtīšanas

Saņemot TCP plūsmā lielumu, kas nav nulle, nulles atgriešana norāda uz sakārtotām tās ienākošās plūsmas beigām. Atzīmējiet šo lasīšanas virzienu kā pabeigtu. Pārtrauciet gaidīt vairāk ievades no tās, bet saglabājiet baitus, kas jau ir rindā pretējai ligzdai.

Kad rinda no klienta uz pakalpojumu ir iztukšota, izsauciet shutdown(service_socket, SHUT_WR) uz POSIX ligzdas. Tas pārtrauc turpmāku pārraidi uz pakalpojumu, vienlaikus atstājot pieejamu virzienu no pakalpojuma uz klientu. Kad pakalpojums pabeidz savu atbildi, pēc atbildes rindas iztukšošanas piemērojiet spoguļoto darbību.

Aprakstītāju aizvēršana pieder pie tā brīža, kad abi virzieni un to gaidošie buferi ir pabeigti, vai kad kļūda vai atcelšana prasa pārtraukšanu. Turiet ierobežotu noildzi partnerim, kurš nekad nepabeidz savu atlikušo pusi.

Gatavība ir uzaicinājums lasīt

Lasāmā ligzdā var būt dati vai EOF stāvoklis. Izsauciet recv un interpretējiet rezultātu. Pozitīvi skaitļi ir pārsūtāmie baiti; nulle ir virziena beigas. Nebloķējošā ligzdā EAGAIN vai EWOULDBLOCK nozīmē, ka pašlaik vairāk ievades nav, savukārt EINTR var prasīt atkārtotu mēģinājumu. Neviens no tiem nav tas pats notikums kā EOF.

Nemeklējiet FIN karodziņu atgrieztajā baitu buferī. TCP piegādā šai API sakārtotu baitu plūsmu; pakešu robežas un FIN segments nav parasta lietojumprogrammas lietderīgā slodze.

Šis ir neapstrādāta baitu tuneļa dzīves cikls. HTTP starpnieks, kas parsē ziņojumus, joprojām ievēro HTTP ietvaru, un TLS pārtraucošai starpniekam arī ir TLS aizvēršanas protokols. Turiet šos protokola lēmumus virs virziena TCP releja.

Saistītie raksti