Kutayotgan baytlarni bo'shatgandan so'ng TCP yarim yopilishini uzatish
TCP proksisida EOF ni navbatdagi ma'lumotni yo'qotmasdan va qarama-qarshi yo'nalishdagi javobni kesmasdan boshqaring.
Mijoz yuborishni tugatadi, proksi EOF ni ko'radi va javob yo'qoladi. Ikkala proksi soketini darhol yopish aynan shu ketma-ketlikni keltirib chiqarishi mumkin. TCP releyda bir yo'nalishdagi tartibli tugash boshqa yo'nalish ham tugaganini bildirmaydi.
So'rov yuboradigan, yuborish tomonini yopadigan va javobni kutadigan mijozni ko'rib chiqing:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Proksining ikkita TCP ulanishi va mustaqil harakatlanuvchi ikkita bayt oqimi bor. U o'zidan oldin keladigan baytlarni uzatgandan so'ng kirishning tugashi belgisini ham oldinga uzatishi kerak.
EOF ni uzatishdan oldin navbatni bo'shating
TCP oqimida noldan farqli o'lchamdagi qabulda nolning qaytishi o'sha kiruvchi oqimning tartibli tugaganini bildiradi. O'sha o'qish yo'nalishini tugagan deb belgilang. Undan boshqa kirishni kutishni to'xtating, lekin qarama-qarshi soket uchun navbatga qo'yilgan baytlarni saqlab qoling.
Mijozdan xizmatga navbat bo'shagach, POSIX soketida shutdown(service_socket, SHUT_WR) ni chaqiring. Bu xizmat tomon yuborishni tugatadi, xizmatdan mijozga yo'nalishi esa ochiq qoladi. Xizmat o'z javobini tugatgach, javob navbatini bo'shatgandan so'ng ko'zgu operatsiyasini qo'llang.
Diskriptorlarni yopish ikkala yo'nalish va ularning kutayotgan buferlari tugagan nuqtaga, yoki xato yoki bekor qilish to'xtatishni talab qiladigan joyga tegishli. Qolgan yarmini hech qachon tugatmaydigan hamkor uchun cheklangan vaqt ushlab turing.
Tayyorlik o'qishga taklifdir
O'qish mumkin bo'lgan soketda ma'lumot yoki EOF holati bo'lishi mumkin. recv ni chaqiring va natijasini izohlang. Musbat sonlar uzatiladigan baytlar; nol yo'nalishning oxiri. Bloklamaydigan soketda EAGAIN yoki EWOULDBLOCK hozir boshqa kirish yo'qligini bildiradi, EINTR esa qayta urinishni talab qilishi mumkin. Ikkalasi ham EOF bilan bir xil hodisa emas.
Qaytarilgan bayt buferida FIN bayrog'ini qidirmang. TCP bu API ga tartibli bayt oqimini yetkazadi; paket chegaralari va FIN segmenti oddiy ilova yuki emas.
Bu xom bayt tunnelining hayot tsikli. Xabarlarni tahlil qiluvchi HTTP proksisi baribir HTTP ramkalashiga rioya qilishi kerak, TLS ni tugatuvchi proksida ham TLS yopish protokoli bor. Bu protokol qarorlarini yo'nalishli TCP releydan yuqori ushlab turing.