Փոխանցել TCP կիսափակումը սպասող բայթերը դատարկելուց հետո
Կառավարեք EOF-ը TCP վստահված սերվերում՝ չկորցնելով հերթում եղած տվյալները և չկտրելով պատասխանը մյուս ուղղությամբ։
Հաճախորդն ավարտում է ուղարկումը, վստահված սերվերը տեսնում է EOF, և պատասխանը անհետանում է։ Երկու վստահված սերվերի սոքեթների անմիջական փակումը կարող է առաջացնել հենց այդ հաջորդականությունը։ TCP փոխանցիչում մեկ ուղղությամբ կարգավորված ավարտը չի նշանակում, որ մյուս ուղղությունն ավարտվել է։
Դիտարկենք հաճախորդ, որը հարցում է ուղարկում, փակում իր ուղարկող կողմը և սպասում պատասխանին.
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Վստահված սերվերն ունի երկու TCP կապուղի և երկու ինքնուրույն շարժվող բայթային հոսք։ Այն պետք է առաջ տանի մուտքի ավարտի ազդանշանը՝ նախ փոխանցելով դրան նախորդող բայթերը։
Դատարկեք հերթը մինչև EOF-ի փոխանցումը
TCP հոսքի վրա ոչ զրոյական չափի ընդունման դեպքում զրոյի վերադարձը ցույց է տալիս այդ մուտքային հոսքի կարգավորված ավարտը։ Նշեք այդ ընթերցման ուղղությունը որպես ավարտված։ Դադարեցրեք դրանից ավելի մուտք սպասելը, բայց պահեք հակառակ սոքեթի համար արդեն հերթագրված բայթերը։
Երբ հաճախորդից ծառայություն հերթը դատարկվի, կանչեք shutdown(service_socket, SHUT_WR) POSIX սոքեթի վրա։ Դա ավարտում է դեպի ծառայություն հետագա փոխանցումը՝ թողնելով ծառայությունից հաճախորդ ուղղությունը հասանելի։ Երբ ծառայությունն ավարտի իր պատասխանը, պատասխանի հերթը դատարկելուց հետո կիրառեք հայելային գործողությունը։
Դեսկրիպտորների փակումը պատկանում է այն պահին, երբ երկու ուղղություններն ու դրանց սպասող բուֆերներն ավարտված են, կամ երբ սխալը կամ չեղարկումը պահանջում են դադարեցում։ Պահեք սահմանափակ ժամկետ այն գործընկերոջ համար, որը երբեք չի ավարտում իր մնացած կեսը։
Պատրաստ լինելը ընթերցելու հրավեր է
Ընթեռնելի սոքեթը կարող է ունենալ տվյալներ կամ EOF վիճակ։ Կանչեք recv և մեկնաբանեք արդյունքը։ Դրական թվերը փոխանցվող բայթեր են. զրոն ուղղության ավարտն է։ Ոչ արգելափակող սոքեթի դեպքում EAGAIN-ը կամ EWOULDBLOCK-ը նշանակում է, որ այժմ ավելի մուտք չկա, մինչդեռ EINTR-ը կարող է պահանջել կրկնակի փորձ։ Դրանցից ոչ մեկը EOF-ի նույն իրադարձությունը չէ։
Չփնտրեք FIN դրոշակ վերադարձված բայթային բուֆերում։ TCP-ն այս API-ին մատակարարում է կարգավորված բայթային հոսք. փաթեթի սահմաններն ու FIN հատվածը սովորական հավելվածային բեռ չեն։
Սա հում բայթային թունելի կյանքի ցիկլն է։ Հաղորդագրությունները վերլուծող HTTP վստահված սերվերը դեռ պետք է հարգի HTTP շրջանակավորումը, իսկ TLS-ը ավարտող վստահված սերվերն էլ ունի TLS փակման արձանագրություն։ Այդ արձանագրային որոշումները պահեք ուղղորդված TCP փոխանցիչից վերև։