Apa praktik terbaik untuk mencegah kecelakaan di sini?
Nonaktifkan sigpipe sesuai setiap orang, atau tangkap dan abaikan kesalahan tersebut.
Apakah ada cara untuk memeriksa apakah sisi lain dari garis masih membaca?
Ya, gunakan select ().
pilih () tampaknya tidak berfungsi di sini karena selalu mengatakan soket dapat ditulisi.
Anda harus memilih pada bit baca . Anda mungkin dapat mengabaikan penulisan bit .
Ketika ujung jauh menutup pegangan file-nya, pilih akan memberi tahu Anda bahwa ada data yang siap dibaca. Ketika Anda pergi dan membacanya, Anda akan mendapatkan kembali 0 byte, yang merupakan cara OS memberi tahu Anda bahwa pegangan file telah ditutup.
Satu-satunya waktu Anda tidak dapat mengabaikan bit tulis adalah jika Anda mengirim volume besar, dan ada risiko ujung yang lain ditumpuk, yang dapat menyebabkan buffer Anda terisi. Jika itu terjadi, maka mencoba menulis ke pegangan file dapat menyebabkan program / utas Anda terblokir atau gagal. Tes pilih sebelum menulis akan melindungi Anda dari itu, tetapi itu tidak menjamin bahwa ujung yang lain sehat atau bahwa data Anda akan tiba.
Perhatikan bahwa Anda bisa mendapatkan sigpipe dari close (), serta saat Anda menulis.
Tutup memerah semua data yang disangga. Jika ujung lainnya sudah ditutup, maka tutup akan gagal, dan Anda akan menerima sigpipe.
Jika Anda menggunakan buffer TCPIP, maka penulisan yang berhasil berarti data Anda telah diantrekan untuk dikirim, itu tidak berarti telah dikirim. Sampai Anda berhasil menutup panggilan, Anda tidak tahu bahwa data Anda telah dikirim.
Sigpipe memberi tahu Anda ada yang tidak beres, tidak memberi tahu Anda apa, atau apa yang harus Anda lakukan.