Fungsi panggilan balik LPWSPCLOSESOCKET (ws2spi.h)

Fungsi LPWSPCloseSocket menutup soket.

Sintaks

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

Parameter

[in] s

Deskriptor mengidentifikasi soket.

[out] lpErrno

Arahkan ke kode kesalahan.

Mengembalikan nilai

Jika tidak ada kesalahan yang terjadi, LPWSPCloseSocket mengembalikan nol. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan kode kesalahan tertentu tersedia di lpErrno.

Kode Kesalahan Makna
WSAENETDOWN
Subsistem jaringan gagal.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAENOTSOCK
Deskriptor bukan soket.
WSAEWOULDBLOCK
Soket ditandai sebagai nonblocking dan SO_LINGER diatur ke nilai waktu habis bukan nol.

Keterangan

Fungsi ini menutup soket. Lebih tepatnya, ini merilis deskriptor soket, sehingga referensi lebih lanjut ke s harus gagal dengan kesalahan WSAENOTSOCK. Jika ini adalah referensi terakhir ke soket yang mendasar, informasi penamaan terkait dan data antrean akan dibuang. Setiap pemblokiran atau panggilan asinkron yang tertunda di soket (dikeluarkan oleh utas apa pun dalam proses ini) dibatalkan tanpa memposting pesan pemberitahuan apa pun. Setiap operasi tumpang tindih yang tertunda yang dikeluarkan oleh utas apa pun dalam proses ini juga dibatalkan. Tindakan penyelesaian apa pun yang ditentukan untuk operasi yang tumpang tindih ini dilakukan (misalnya, peristiwa, rutinitas penyelesaian, atau port penyelesaian). Dalam hal ini, operasi tumpang tindih yang tertunda gagal dengan status kesalahan WSA_OPERATION_ABORTED . FD_CLOSE tidak akan diposting setelah LPWSPCloseSocket dipanggil.

Perilaku LPWSPCloseSocket dirangkum sebagai berikut:

  • Jika SO_DONTLINGER diaktifkan (pengaturan default), LPWSPCloseSocket segera kembali dan koneksi ditutup dengan lancar di latar belakang.

  • Jika SO_LINGER diaktifkan dengan waktu habis nol, LPWSPCloseSocket segera kembali dan koneksi diatur ulang/dihentikan.

    atau

  • Jika SO_LINGER diaktifkan dengan batas waktu nonzero dengan soket pemblokiran, LPWSPCloseSocket memblokir hingga semua data dikirim atau waktu habis.

  • Jika SO_LINGER diaktifkan dengan batas waktu non-zero dengan soket nonblocking, LPWSPCloseSocket akan segera kembali, sehingga menunjukkan kegagalan.

Semantik LPWSPCloseSocket dipengaruhi oleh opsi soket SO_LINGER dan SO_DONTLINGER sebagai berikut.

Opsi Interval Jenis penutupan Tunggu tutup?
SO_DONTLINGER Jangan peduli Ringan Tidak
SO_LINGER Nol Keras Tidak
SO_LINGER Bukan nol Ringan Ya

 

 

Jika SO_LINGER diatur (yaitu, anggota l_onoff struktur yang lebih hidup bukan nol) dan interval waktu habis, l_linger, adalah nol, LPWSPCloseSocket tidak diblokir meskipun data yang diantrekan belum dikirim atau diakui. Ini disebut penutupan yang keras atau abortif, karena sirkuit virtual soket segera direset, dan data yang tidak terkirim hilang. Setiap panggilan LPWSPRecv di sisi jarak jauh sirkuit akan gagal dengan WSAECONNRESET.

Jika SO_LINGER diatur dengan interval waktu habis bukan nol pada soket pemblokiran, panggilan LPWSPCloseSocket memblokir soket pemblokiran hingga data yang tersisa dikirim atau hingga batas waktu berakhir. Ini disebut pemutusan sambungan dengan anggun. Jika waktu habis berakhir sebelum semua data dikirim, penyedia layanan harus menghentikan koneksi sebelum LPWSPCloseSocket kembali.

Mengaktifkan SO_LINGER dengan interval waktu habis bukan nol pada soket yang tidak diblokir tidak disarankan. Dalam hal ini, panggilan ke LPWSPCloseSocket akan gagal dengan kesalahan WSAEWOULDBLOCK jika operasi penutupan tidak dapat segera diselesaikan. Jika LPWSPCloseSocket gagal dengan WSAEWOULDBLOCK, handel soket masih valid dan pemutusan sambungan tidak dimulai.

Klien Winsock SPI harus memanggil LPWSPCloseSocket lagi untuk menutup soket, meskipun LPWSPCloseSocket dapat terus gagal kecuali klien Winsock SPI melakukan salah satu hal berikut:

  • Menonaktifkan SO_DONTLINGER.
  • Mengaktifkan SO_LINGER dengan waktu habis nol.
  • Memanggil LPWSPShutdown untuk memulai penutupan.

Jika SO_DONTLINGER diatur pada soket aliran (yaitu, anggota l_onoff struktur yang masih ada adalah nol), panggilan LPWSPCloseSocket akan segera kembali dan tidak mendapatkan WSAEWOULDBLOCK, apakah soket memblokir atau tidak memblokir. Namun, setiap data yang diantrekan untuk transmisi akan dikirim jika memungkinkan sebelum soket yang mendasar ditutup. Ini disebut pemutusan sambungan dengan anggun dan merupakan perilaku default.

Perhatikan bahwa dalam hal ini penyedia Winsock diizinkan untuk mempertahankan sumber daya apa pun yang terkait dengan soket sampai waktu seperti pemutusan sambungan dengan baik telah selesai atau penyedia menghentikan koneksi karena ketidakmampuan untuk menyelesaikan operasi dalam jumlah waktu yang ditentukan penyedia. Ini dapat memengaruhi klien Winsock yang berharap untuk menggunakan semua soket yang tersedia. Ini adalah perilaku default; SO_DONTLINGER diatur secara default.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 2000 Professional [hanya aplikasi desktop]
Server minimum yang didukung Windows 2000 Server [hanya aplikasi desktop]
Header ws2spi.h

Lihat juga

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket