Bagikan melalui


Shutdown Anggun, Opsi Linger, dan Penutupan Soket

Materi berikut disediakan sebagai klarifikasi untuk subjek mematikan koneksi soket yang menutup soket. Penting untuk membedakan perbedaan antara mematikan koneksi soket dan menutup soket.

Mematikan koneksi soket melibatkan pertukaran pesan protokol antara dua titik akhir, selanjutnya disebut sebagai urutan pematian. Dua kelas umum urutan pematian didefinisikan: anggun dan abortif (juga disebut keras). Dalam urutan matikan dengan baik, data apa pun yang telah diantrekan, tetapi belum dikirimkan dapat dikirim sebelum koneksi ditutup. Dalam pematian abortif, data yang tidak terkirim akan hilang. Terjadinya urutan matikan (anggun atau abortif) juga dapat digunakan untuk memberikan indikasi FD_CLOSE ke aplikasi terkait yang menandakan bahwa pematian sedang berlangsung.

Menutup soket, di sisi lain, menyebabkan handel soket menjadi tidak dialokasikan sehingga aplikasi tidak dapat lagi mereferensikan atau menggunakan soket dengan cara apa pun.

Di Windows Sockets, baik fungsi matikan , dan fungsi WSASendDisconnect dapat digunakan untuk memulai urutan pematian, sementara fungsi closesocket digunakan untuk membatalkan alokasi handel soket dan membebaskan sumber daya terkait. Beberapa kebingungan muncul, namun, dari fakta bahwa fungsi closesocket secara implisit menyebabkan urutan pematian terjadi jika belum terjadi. Bahkan, telah menjadi praktik pemrograman yang agak umum untuk mengandalkan fitur ini dan menggunakan closesocket untuk memulai urutan pematian dan membatalkan handel soket.

Untuk memfasilitasi penggunaan ini, antarmuka soket menyediakan kontrol dengan cara mekanisme opsi soket yang memungkinkan programmer untuk menunjukkan apakah urutan pematian implisit harus anggun atau abortif, dan juga apakah fungsi closesocket harus tetap ada (yang tidak segera selesai) untuk memungkinkan waktu agar urutan pematian yang anggun selesai. Perbedaan penting ini dan konsekuensi penggunaan closesocket dengan cara ini masih belum dipahami secara luas.

Dengan menetapkan nilai yang sesuai untuk opsi soket SO_LINGER dan SO_DONTLINGER, jenis perilaku berikut dapat diperoleh dengan fungsi closesocket :

  • Urutan matikan abortif, segera kembali dari closesocket.
  • Mematikan dengan baik, menunda pengembalian hingga urutan matikan selesai atau interval waktu yang ditentukan berlalu. Jika interval waktu kedaluwarsa sebelum urutan matikan dengan anggun selesai, urutan matikan abortif terjadi, dan closesocket akan kembali.
  • Matikan dengan baik, segera kembali—memungkinkan urutan pematian selesai di latar belakang. Meskipun ini adalah perilaku default, aplikasi tidak memiliki cara untuk mengetahui kapan (atau apakah) urutan shutdown yang anggun benar-benar selesai.

Penggunaan opsi soket SO_LINGER dan SO_DONTLINGER dan struktur linger terkait dibahas secara lebih rinci di bagian referensi pada Opsi Soket SOL_SOCKET dan struktur hidup .

Salah satu teknik yang dapat digunakan untuk meminimalkan kemungkinan masalah yang terjadi selama teardown koneksi adalah menghindari mengandalkan pematian implisit yang dimulai oleh closesocket. Sebagai gantinya, gunakan salah satu dari dua fungsi matikan eksplisit, matikan atau WSASendDisconnect. Hal ini pada gilirannya menyebabkan indikasi FD_CLOSE diterima oleh aplikasi serekan yang menunjukkan bahwa semua data yang tertunda telah diterima. Untuk mengilustrasikan hal ini, tabel berikut menunjukkan fungsi yang akan dipanggil oleh klien dan komponen server aplikasi, di mana klien bertanggung jawab untuk memulai pematian dengan baik.

Sisi klien Sisi server
(1) Memanggil matikan, SD_SEND) untuk memberi sinyal akhir sesi dan klien tidak memiliki data lagi untuk dikirim.
(2) Menerima FD_CLOSE, menunjukkan pematian anggun sedang berlangsung dan bahwa semua data telah diterima.
(3) Mengirim data respons yang tersisa.
(hanya signifikansi waktu lokal) Mendapatkan FD_READ dan panggilan recv untuk mendapatkan data respons apa pun yang dikirim oleh server . (4) Memanggil pematian, SD_SEND) untuk menunjukkan server tidak memiliki lebih banyak data untuk dikirim.
(5) Menerima indikasi FD_CLOSE. (hanya signifikansi waktu lokal) Memanggil closesocket .
(6) Memanggil closesocket.