Menelepon close
danshutdown
memiliki dua efek berbeda pada soket yang mendasarinya.
Hal pertama yang perlu diperhatikan adalah bahwa soket adalah sumber daya di OS yang mendasarinya dan beberapa proses dapat menangani soket dasar yang sama.
Ketika Anda memanggilnya close
mengurangi jumlah pegangan satu dan jika jumlah pegangan telah mencapai nol maka soket dan koneksi terkait melewati prosedur penutupan normal (secara efektif mengirim FIN / EOF ke peer) dan soket dibatalkan alokasinya.
Hal yang perlu diperhatikan disini adalah jika jumlah pegangan tidak mencapai nol karena proses lain masih mempunyai pegangan ke soket maka koneksi tidak ditutup dan soket tidak dibatalkan alokasinya.
Di sisi lain, panggilan shutdown
untuk membaca dan menulis menutup koneksi yang mendasarinya dan mengirimkan FIN / EOF ke peer terlepas dari berapa banyak proses yang ditangani ke soket. Namun, itu tidak membatalkan alokasi soket dan Anda masih harus menutup setelahnya.
shutdown()
:).shutdown()
dan di saluran berikutnya.close()
? Atau haruskah ada penundaan di antaranya?Penjelasan shutdown dan close: Graceful shutdown (msdn)
Shutdown (dalam kasus Anda) menunjukkan ke ujung lain koneksi tidak ada niat lebih lanjut untuk membaca atau menulis ke soket. Kemudian tutup membebaskan memori apa pun yang terkait dengan soket.
Menghilangkan pematian dapat menyebabkan soket tetap berada di tumpukan OS sampai koneksi telah ditutup dengan baik.
IMO nama 'shutdown' dan 'close' menyesatkan, 'close' dan 'destroy' akan menekankan perbedaan mereka.
sumber
itu disebutkan tepat di Socket Programming HOWTO ( py2 / py3 )
sumber
close()
sudah cukup. Dokumentasi Python harus diperbaiki.Bukankah kode di atas ini salah?
Penutupan panggilan langsung setelah panggilan shutdown mungkin membuat kernel membuang semua buffer keluar.
Menurut http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable seseorang perlu menunggu antara shutdown dan tutup sampai pembacaan kembali 0.
sumber
ada beberapa cara mematikan: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . * nix mirip.
sumber
Shutdown (1), memaksa soket no untuk mengirim lebih banyak data
Ini berguna di
1- Pembilasan penyangga
2- Deteksi kesalahan yang aneh
3- Penjagaan yang aman
Biar saya jelaskan lebih lanjut, ketika Anda mengirim data dari A ke B, itu tidak dijamin akan dikirim ke B, itu hanya dijamin akan dikirim ke buffer A os, yang pada gilirannya mengirimkannya ke buffer B os
Jadi dengan memanggil shutdown (1) pada A, Anda mengosongkan buffer A dan kesalahan akan muncul jika buffer tidak kosong, yaitu: data belum dikirim ke peer
Bagaimanapun ini tidak dapat dibatalkan, jadi Anda dapat melakukannya setelah Anda benar-benar mengirim semua data Anda dan Anda ingin memastikan bahwa itu setidaknya di peer os buffer
sumber