Klien selesai mengirim, proxy melihat EOF, dan balasan menghilang. Menutup kedua soket proxy seketika dapat menyebabkan urutan persis seperti itu. Dalam relai TCP, akhir yang tertib di satu arah tidak berarti arah lain sudah selesai.

Perhatikan klien yang mengirim permintaan, menutup sisi pengirimannya, dan menunggu jawaban:

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

Proxy memiliki dua koneksi TCP dan dua aliran byte yang bergerak secara mandiri. Proxy harus meneruskan penanda akhir masukan setelah meneruskan byte yang mendahuluinya.

Habisi antrean sebelum meneruskan EOF

Pada penerimaan berukuran bukan nol di aliran TCP, pengembalian nol menandakan akhir yang tertib dari aliran masuk tersebut. Tandai arah baca itu sebagai selesai. Berhenti menunggu masukan lebih lanjut darinya, tetapi pertahankan byte yang sudah mengantre untuk soket seberang.

Setelah antrean klien-ke-layanan habis, panggil shutdown(service_socket, SHUT_WR) pada soket POSIX. Itu mengakhiri pengiriman lebih lanjut ke arah layanan sementara arah layanan-ke-klien tetap tersedia. Saat layanan menyelesaikan balasannya, terapkan operasi cermin setelah antrean balasan habis.

Penutupan deskriptor berada pada titik ketika kedua arah dan penyangga tertundanya selesai, atau ketika kesalahan atau pembatalan menuntut penghentian. Pertahankan batas waktu terbatas untuk rekan yang tidak pernah menyelesaikan separuh sisanya.

Kesiapan adalah undangan untuk membaca

Soket yang dapat dibaca bisa berisi data atau kondisi EOF. Panggil recv dan tafsirkan hasilnya. Hitungan positif adalah byte yang akan diteruskan; nol adalah akhir arah. Pada soket nonblokir, EAGAIN atau EWOULDBLOCK berarti saat ini tidak ada masukan lagi, sedangkan EINTR mungkin memerlukan percobaan ulang. Keduanya bukan peristiwa yang sama dengan EOF.

Jangan mencari bendera FIN di penyangga byte yang dikembalikan. TCP mengirimkan aliran byte teratur ke API ini; batas paket dan segmen FIN bukan muatan aplikasi biasa.

Ini adalah siklus hidup terowongan byte mentah. Proxy HTTP yang mengurai pesan tetap harus menghormati pembingkaian HTTP, dan proxy yang mengakhiri TLS juga memiliki protokol penutupan TLS. Pertahankan keputusan protokol itu di atas relai TCP terarah.

Artikel terkait