fungsi closesocket (winsock.h)

Fungsi closesocket menutup soket yang ada.

Sintaks

int closesocket(
  [in] SOCKET s
);

Parameter

[in] s

Deskriptor yang mengidentifikasi soket untuk ditutup.

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, closesocket mengembalikan nol. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.

Kode kesalahan Makna
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAENETDOWN
Subsistem jaringan gagal.
WSAENOTSOCK
Deskriptor bukan soket.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEINTR
Panggilan (memblokir) Windows Socket 1.1 dibatalkan melalui WSACancelBlockingCall.
WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking, tetapi l_onoff anggota struktur linger diatur ke nonzero dan anggota l_linger struktur yang masih ada diatur ke nilai batas waktu bukan nol.

Keterangan

Fungsi closesocket menutup soket. Gunakan untuk merilis deskriptor soket yang diteruskan dalam parameter s . Perhatikan bahwa deskriptor soket yang diteruskan dalam parameter s dapat segera digunakan kembali oleh sistem segera setelah fungsi closesocket dikeluarkan. Akibatnya, tidak dapat diandalkan untuk mengharapkan referensi lebih lanjut ke deskriptor soket yang diteruskan dalam parameter s gagal dengan kesalahan WSAENOTSOCK. Klien Winsock tidak boleh mengeluarkan closesocket secara bersamaan dengan panggilan fungsi Winsock lain.

Setiap operasi kirim dan terima yang tumpang tindih yang tertunda ( WSASendWSASendTo/ / WSARecv/ WSARecvFrom dengan soket tumpang tindih) yang dikeluarkan oleh utas apa pun dalam proses ini juga dibatalkan. Setiap tindakan peristiwa, rutinitas penyelesaian, atau port penyelesaian yang ditentukan untuk operasi yang tumpang tindih ini dilakukan. Operasi tumpang tindih yang tertunda gagal dengan status kesalahan WSA_OPERATION_ABORTED.

Aplikasi tidak boleh berasumsi bahwa setiap operasi I/O yang luar biasa pada soket semuanya akan dijamin selesai ketika closesocket kembali. Fungsi closesocket akan memulai pembatalan pada operasi I/O yang luar biasa, tetapi itu tidak berarti bahwa aplikasi akan menerima penyelesaian I/O untuk operasi I/O ini pada saat fungsi closesocket kembali. Dengan demikian, aplikasi tidak boleh membersihkan sumber daya apa pun (struktur WSAOVERLAPPED , misalnya) yang dirujuk oleh permintaan I/O yang luar biasa sampai permintaan I/O memang selesai.

Aplikasi harus selalu memiliki panggilan yang cocok untuk menutup okket untuk setiap panggilan yang berhasil ke soket untuk mengembalikan sumber daya soket apa pun ke sistem.

Struktur linger mempertahankan informasi tentang soket tertentu yang menentukan bagaimana soket tersebut harus bereaksi ketika data diantrekan untuk dikirim dan fungsi closesocket dipanggil pada soket.

Anggota l_onoff dari struktur linger menentukan apakah soket harus tetap terbuka selama jangka waktu tertentu setelah panggilan fungsi closesocket untuk memungkinkan data antrean dikirim. Anggota ini dapat dimodifikasi dengan dua cara:

  • Panggil fungsi setsockopt dengan parameter optname diatur ke SO_DONTLINGER. Parameter optval menentukan bagaimana anggota l_onoff dimodifikasi.
  • Panggil fungsi setsockopt dengan parameter optname diatur ke SO_LINGER. Parameter optval menentukan bagaimana anggota l_onoff dan l_linger dimodifikasi.

Anggota l_linger struktur yang masih ada menentukan jumlah waktu, dalam hitungan detik, soket harus tetap terbuka. Anggota ini hanya berlaku jika anggota l_onoff struktur yang masih ada bukan nol.

Parameter default untuk soket adalah anggota l_onoff dari struktur linger adalah nol, yang menunjukkan bahwa soket tidak boleh tetap terbuka. Nilai default untuk anggota l_linger struktur berlama-lama adalah nol, tetapi nilai ini diabaikan saat anggota l_onoff diatur ke nol.

Untuk mengaktifkan soket agar tetap terbuka, aplikasi harus mengatur anggota l_onoff ke nilai bukan nol dan mengatur anggota l_linger ke batas waktu yang diinginkan dalam detik. Untuk menonaktifkan soket agar tidak tetap terbuka, aplikasi hanya perlu mengatur anggota l_onoff struktur yang masih ada ke nol.

Jika aplikasi memanggil fungsi setsockopt dengan parameter optname yang diatur ke SO_DONTLINGER untuk mengatur anggota l_onoff ke nilai bukan nol, nilai untuk anggota l_linger tidak ditentukan. Dalam hal ini, batas waktu yang digunakan tergantung pada implementasi. Jika batas waktu sebelumnya telah ditetapkan untuk soket (dengan sebelumnya memanggil fungsi setsockopt dengan parameter optname yang diatur ke SO_LINGER), nilai batas waktu ini harus dipulihkan oleh penyedia layanan.

Semantik fungsi closesocket dipengaruhi oleh opsi soket yang menetapkan anggota struktur yang berlama-lama .

l_onoff l_linger Jenis penutupan Tunggu penutupan?
Nol Jangan peduli Anggun dekat Tidak
bukan nol Nol Keras Tidak
bukan nol bukan nol Anggun jika semua data dikirim dalam nilai batas waktu yang ditentukan dalam anggota l_linger .

Sulit jika semua data tidak dapat dikirim dalam nilai batas waktu yang ditentukan dalam anggota l_linger .

Ya
 

Jika anggota l_onoff struktur LINGER nol pada soket aliran, panggilan closesocket akan segera kembali dan tidak menerima WSAEWOULDBLOCK apakah soket memblokir atau tidak memblokir. Namun, data apa pun yang diantrekan untuk transmisi akan dikirim, jika memungkinkan, sebelum soket yang mendasar ditutup. Ini juga disebut pemutusan atau penutupan yang anggun. Dalam hal ini, penyedia Soket Windows tidak dapat melepaskan soket dan sumber daya lain untuk periode arbitrer, sehingga memengaruhi aplikasi yang berharap untuk menggunakan semua soket yang tersedia. Ini adalah perilaku default untuk soket.

Jika anggota l_onoff struktur berlama-lama bukan nol dan anggota l_linger nol, closesocket tidak diblokir meskipun data yang diantrekan belum dikirim atau diakui. Ini disebut penutupan yang keras atau abortif, karena sirkuit virtual soket segera diatur ulang, dan data yang tidak terkirim hilang. Pada Windows, setiap panggilan recv di sisi jarak jauh sirkuit akan gagal dengan WSAECONNRESET.

Jika anggota l_onoff struktur hidup diatur ke nonzero dan anggota l_linger diatur ke batas waktu nonzero pada soket pemblokiran, panggilan closesocket memblokir hingga data yang tersisa telah dikirim atau sampai batas waktu berakhir. Ini disebut pemutusan atau penutupan anggun jika semua data dikirim dalam nilai batas waktu yang ditentukan dalam anggota l_linger . Jika waktu habis kedaluwarsa sebelum semua data dikirim, implementasi Windows Sockets mengakhiri koneksi sebelum closesocket kembali dan ini disebut penutupan yang keras atau abortif.

Mengatur anggota l_onoff struktur berlama-lama ke nonzero dan anggota l_linger dengan interval batas waktu nonzero pada soket yang tidak memblokir tidak disarankan. Dalam hal ini, panggilan ke closesocket akan gagal dengan kesalahan WSAEWOULDBLOCK jika operasi penutupan tidak dapat segera diselesaikan. Jika closesocket gagal dengan WSAEWOULDBLOCK , handel soket masih valid, dan pemutusan sambungan tidak dimulai. Aplikasi harus memanggil closesocket lagi untuk menutup soket.

Jika anggota l_onoff struktur berlama-lama bukan nol dan anggota l_linger adalah interval batas waktu bukan nol pada soket pemblokiran, hasil fungsi closesocket tidak dapat digunakan untuk menentukan apakah semua data telah dikirim ke serekan. Jika data dikirim sebelum batas waktu yang ditentukan dalam anggota l_linger kedaluwarsa atau jika koneksi dibatalkan, fungsi closesocket tidak akan mengembalikan kode kesalahan (nilai pengembalian dari fungsi closesocket adalah nol).

Panggilan closesocket hanya akan memblokir hingga semua data dikirimkan ke peer atau batas waktu berakhir. Jika koneksi diatur ulang karena waktu habis kedaluwarsa, soket tidak akan masuk ke status TIME_WAIT. Jika semua data dikirim dalam periode batas waktu, soket dapat masuk ke status TIME_WAIT.

Jika anggota l_onoff struktur berlama-lama bukan nol dan anggota l_linger adalah interval batas waktu nol pada soket pemblokiran, panggilan ke closesocket akan mengatur ulang koneksi. Soket tidak akan masuk ke status TIME_WAIT.

Fungsi getsockopt dapat dipanggil dengan parameter optname yang diatur ke SO_LINGER untuk mengambil nilai struktur linger saat ini yang terkait dengan soket.

Catatan Untuk memastikan bahwa semua data dikirim dan diterima pada koneksi, aplikasi harus memanggil matikan sebelum memanggil closesocket (lihat Mematikan dengan baik, opsi hidup, dan penutupan soket untuk informasi selengkapnya). Perhatikan juga, peristiwa jaringan FD_CLOSE tidak diposting setelah closesocket dipanggil.
 

Berikut adalah ringkasan perilaku closesocket :

  • Jika anggota l_onoff struktur LINGER adalah nol (default untuk soket), closesocket segera kembali dan koneksi ditutup dengan lancar di latar belakang.
  • Jika anggota l_onoff struktur yang berlama-lama diatur ke nonzero dan anggota l_linger diatur ke nol (tanpa batas waktu) closesocket akan segera kembali dan koneksi diatur ulang atau dihentikan.
  • Jika anggota l_onoff struktur berlama-lama diatur ke nonzero dan anggota l_linger diatur ke batas waktu nonzero:– Untuk soket pemblokiran, blok closesocket hingga semua data dikirim atau batas waktu berakhir.

    – Untuk soket yang tidak memblokir, closesocket kembali segera menunjukkan kegagalan.

Untuk informasi tambahan, silakan lihat Penutupan Anggun, Opsi Linger, dan Penutupan Soket untuk informasi selengkapnya.

Catatan Saat mengeluarkan panggilan Winsock pemblokiran seperti closesocket, Winsock mungkin perlu menunggu acara jaringan sebelum panggilan selesai. Winsock melakukan penantian yang dapat diperingatkan dalam situasi ini, yang dapat terganggu oleh panggilan prosedur asinkron (APC) yang dijadwalkan pada utas yang sama. Mengeluarkan panggilan Winsock pemblokiran lain di dalam APC yang mengganggu panggilan Winsock pemblokiran yang sedang berlangsung pada utas yang sama akan menyebabkan perilaku yang tidak terdefinisi, dan tidak boleh dicoba oleh klien Winsock.
 

Catatan untuk Soket IrDA

Ingatlah hal-hal berikut ini:

  • File header Af_irda.h harus disertakan secara eksplisit.
  • Opsi linger standar didukung.
  • Meskipun IrDA tidak menyediakan penutupan yang anggun, IrDA akan menunda penutupan sampai antrean penerimaan dibersihkan. Dengan demikian, aplikasi dapat mengirim data dan segera memanggil fungsi soket , dan yakin bahwa penerima akan menyalin data sebelum menerima pesan FD_CLOSE.

Catatan untuk ATM

Berikut ini adalah masalah penting yang terkait dengan teardown koneksi saat menggunakan Mode Transfer Asinkron (ATM) dan Windows Sockets 2:

  • Menggunakan fungsi closesocket atau shutdown dengan SD_SEND atau SD_BOTH menghasilkan sinyal RELEASE yang dikirim pada saluran kontrol. Karena penggunaan ATM dari sinyal dan saluran data yang terpisah, ada kemungkinan sinyal RELEASE dapat mencapai ujung jarak jauh sebelum data terakhir mencapai tujuannya, yang mengakibatkan hilangnya data tersebut. Salah satu solusi yang mungkin adalah memprogram penundaan yang cukup antara data terakhir yang dikirim dan fungsi closesocket atau shutdown memanggil soket ATM.
  • Setengah tutup tidak didukung oleh ATM.
  • Pemutusan sambungan abortif dan anggun mengakibatkan sinyal RELEASE dikirim dengan bidang penyebab yang sama. Dalam kedua kasus, data yang diterima di ujung jarak jauh soket masih dikirimkan ke aplikasi. Lihat Penutupan Anggun, Opsi Linger, dan Penutupan Soket untuk informasi selengkapnya.

Windows Phone 8: Fungsi ini didukung untuk aplikasi Windows Phone Store di Windows Phone 8 dan yang lebih baru.

Windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header winsock.h (termasuk Winsock2.h)
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

Shutdown Yang Anggun, Opsi Linger, dan Penutupan Soket

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Fungsi Winsock

Referensi Winsock

Menerima

getsockopt

ioctlsocket

Berlama

setsockopt

soket