Menghantar Tutup-Separuh TCP Selepas Mengosongkan Bait yang Tertangguh
Kendalikan EOF dalam proksi TCP tanpa menggugurkan data dalam baris gilir atau memotong balasan di arah bertentangan.
Klien selesai menghantar, proksi melihat EOF, dan balasan hilang. Menutup kedua-dua soket proksi serta-merta boleh menyebabkan urutan itu tepat. Dalam geganti TCP, penghujung teratur dalam satu arah tidak bermakna arah yang lain sudah selesai.
Pertimbangkan klien yang menghantar permintaan, menutup bahagian penghantarannya dan menunggu jawapan:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
Proksi mempunyai dua sambungan TCP dan dua aliran bait yang bergerak secara bebas. Ia perlu membawa petunjuk penghujung input ke hadapan, selepas membawa bait yang mendahuluinya.
Kosongkan baris gilir sebelum menghantar EOF
Pada penerimaan bersaiz bukan sifar pada aliran TCP, pulangan sifar menandakan penghujung teratur bagi aliran masuk itu. Tandakan arah bacaan itu sebagai selesai. Berhenti menunggu input lanjut daripadanya, tetapi kekalkan bait yang sudah dimasukkan ke baris gilir untuk soket bertentangan.
Setelah baris gilir klien-ke-perkhidmatan dikosongkan, panggil shutdown(service_socket, SHUT_WR) pada soket POSIX. Itu menamatkan penghantaran selanjutnya ke arah perkhidmatan sambil membiarkan arah perkhidmatan-ke-klien tersedia. Apabila perkhidmatan menyelesaikan balasannya, gunakan operasi cermin selepas mengosongkan baris gilir balasan.
Penutupan deskriptor terletak pada titik apabila kedua-dua arah dan penimbal tertangguh mereka selesai, atau apabila ralat atau pembatalan memerlukan penamatan. Kekalkan had masa terbatas untuk rakan yang tidak pernah menyelesaikan separuh selebihnya.
Kesediaan ialah jemputan untuk membaca
Soket yang boleh dibaca mungkin mempunyai data atau keadaan EOF. Panggil recv dan tafsirkan hasilnya. Kiraan positif ialah bait untuk dihantar; sifar ialah penghujung arah. Pada soket tidak menyekat, EAGAIN atau EWOULDBLOCK bermaksud tiada lagi input pada masa ini, manakala EINTR mungkin memerlukan percubaan semula. Kedua-duanya bukan peristiwa yang sama dengan EOF.
Jangan cari bendera FIN dalam penimbal bait yang dikembalikan. TCP menyampaikan aliran bait tersusun kepada API ini; sempadan paket dan segmen FIN bukan muatan aplikasi biasa.
Ini ialah kitaran hayat terowong bait mentah. Proksi HTTP yang menghuraikan mesej masih perlu menghormati pembingkaian HTTP, dan proksi yang menamatkan TLS juga mempunyai protokol penutupan TLS. Kekalkan keputusan protokol itu di atas geganti TCP berarah.