La kliento finas sendi, la prokurilo vidas EOF, kaj la respondo malaperas. Tuj fermi ambaŭ prokurilajn poŝojn povas kaŭzi ĝuste tiun sekvencon. En TCP-relajso, orda fino en unu direkto ne signifas, ke la alia direkto finiĝis.

Konsideru klienton, kiu sendas peton, fermas sian sendan flankon kaj atendas la respondon:

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

La prokurilo havas du TCP-konektojn kaj du sendepende moviĝantajn bajtajn fluojn. Ĝi devas porti la indikon de eniga fino antaŭen, post kiam ĝi portis la bajtojn, kiuj antaŭas ĝin.

Malplenigu la vicon antaŭ ol plusendi EOF

Ĉe ricevo de nenula grandeco sur TCP-fluo, redono de nulo indikas ordan finon de tiu envenanta fluo. Marku tiun legdirekton kiel finitan. Ĉesu atendi plian enigon de ĝi, sed konservu bajtojn jam vicigitajn por la kontraŭa poŝo.

Post kiam la vico de kliento al servo malpleniĝis, voku shutdown(service_socket, SHUT_WR) sur POSIX-poŝo. Tio finas pluan dissendadon al la servo, dum la direkto de servo al kliento restas havebla. Kiam la servo finas sian respondon, apliku la spegulan operacion post malplenigo de la responda vico.

Fermi la priskribilojn apartenas al la punkto, kie ambaŭ direktoj kaj iliaj atendaj bufroj estas finitaj, aŭ kie eraro aŭ nuligo postulas finiĝon. Tenu limigitan tempolimon por samtavolano, kiu neniam kompletigas sian restantan duonon.

Preteco estas invito legi

Legebla poŝo povas havi datumojn aŭ EOF-staton. Voku recv kaj interpretu la rezulton. Pozitivaj nombroj estas bajtoj plusendotaj; nulo estas la direkta fino. Sur nebloka poŝo, EAGAIN aŭ EWOULDBLOCK signifas, ke nun ne estas plia enigo, dum EINTR eble postulas reprovon. Neniu el ili estas la sama evento kiel EOF.

Ne serĉu FIN-flagon en la redonita bajta bufro. TCP liveras ordan bajtan fluon al ĉi tiu API; pakaĵaj limoj kaj la FIN-segmento ne estas ordinara aplikaĵa ŝarĝo.

Ĉi tio estas la vivciklo de kruda bajta tunelo. HTTP-prokurilo, kiu analizas mesaĝojn, ankoraŭ devas respekti HTTP-kadrigon, kaj TLS-finanta prokurilo ankaŭ havas TLS-fermprotokolon. Tenu tiujn protokolajn decidojn super la direkta TCP-relajso.

Rilataj artikoloj