Fungsi panggilan balik LPWSPEVENTSELECT (ws2spi.h)

Fungsi LPWSPEventSelect menentukan objek peristiwa yang akan dikaitkan dengan serangkaian peristiwa jaringan yang disediakan.

Sintaks

LPWSPEVENTSELECT Lpwspeventselect;

int Lpwspeventselect(
  [in]  SOCKET s,
  [in]  WSAEVENT hEventObject,
  [in]  long lNetworkEvents,
  [out] LPINT lpErrno
)
{...}

Parameter

[in] s

Deskriptor yang mengidentifikasi soket.

[in] hEventObject

Handel yang mengidentifikasi objek peristiwa yang akan dikaitkan dengan serangkaian peristiwa jaringan yang disediakan.

[in] lNetworkEvents

Bitmask yang menentukan kombinasi peristiwa jaringan di mana klien Windows Sockets SPI memiliki minat. Dibangun dengan menggunakan operator OR bitwise dengan salah satu nilai ini.

Nilai Makna
FD_READ
Masalah pemberitahuan kesiapan untuk membaca.
FD_WRITE
Masalah pemberitahuan kesiapan untuk menulis.
FD_OOB
Masalah pemberitahuan kedatangan data OOB.
FD_ACCEPT
Pemberitahuan masalah koneksi masuk.
FD_CONNECT
Pemberitahuan masalah koneksi yang telah selesai.
FD_CLOSE
Masalah pemberitahuan penutupan soket.
FD_QOS
Masalah pemberitahuan perubahan soket (QoS).
FD_GROUP_QOS
Dicadangkan.
FD_ROUTING_INTERFACE_CHANGE
Masalah pemberitahuan perubahan antarmuka perutean untuk tujuan yang ditentukan.
FD_ADDRESS_LIST_CHANGE
Masalah pemberitahuan perubahan daftar alamat lokal untuk keluarga alamat soket.

[out] lpErrno

Penunjuk ke kode kesalahan. Lihat bagian Nilai pengembalian untuk informasi selengkapnya.

Nilai kembali

Nilai yang dikembalikan adalah nol jika spesifikasi klien Windows Sockets SPI dari peristiwa jaringan dan objek peristiwa terkait berhasil. Jika tidak, nilai SOCKET_ERROR dikembalikan, dan nomor kesalahan tertentu tersedia di lpErrno.

Kode Kesalahan Makna
WSAENETDOWN
Subsistem jaringan gagal.
WSAEINVAL
Menunjukkan bahwa salah satu parameter yang ditentukan tidak valid, atau soket yang ditentukan dalam status tidak valid.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets sedang berlangsung atau penyedia layanan masih memproses fungsi panggilan balik.
WSAENOTSOCK
Deskriptor bukan soket.

Keterangan

Fungsi ini digunakan untuk menentukan objek peristiwa, hEventObject, untuk dikaitkan dengan peristiwa jaringan yang dipilih, lNetworkEvents. Soket tempat objek peristiwa ditentukan diidentifikasi oleh s. Objek peristiwa diatur ketika salah satu peristiwa jaringan yang dicalonkan terjadi.

LPWSPEventSelect beroperasi sangat mirip dengan LPWSPAsyncSelect, perbedaannya adalah dalam tindakan yang diambil ketika peristiwa jaringan yang dicalonkan terjadi. Sedangkan WSPAsyncSelect menyebabkan pesan Windows yang ditentukan klien Windows Sockets SPI diposting, LPWSPEventSelect mengatur objek peristiwa terkait dan merekam kejadian ini dalam rekaman peristiwa jaringan internal. Klien Windows Sockets SPI dapat menggunakan LPWSPEnumNetworkEvents untuk mengambil konten rekaman peristiwa jaringan internal, dan dengan demikian menentukan peristiwa jaringan mana yang dicalonkan telah terjadi.

LPWSPEventSelect adalah satu-satunya fungsi yang menyebabkan aktivitas dan kesalahan jaringan dicatat dan diambil melalui LPWSPEnumNetworkEvents. Lihat deskripsi LPWSPSelect dan LPWSPAsyncSelect untuk mengetahui bagaimana fungsi tersebut melaporkan aktivitas dan kesalahan jaringan.

Fungsi ini secara otomatis mengatur soket ke mode nonblocking, terlepas dari nilai lNetworkEvents.

Mengeluarkan LPWSPEventSelect untuk soket membatalkan LPWSPAsyncSelect atau LPWSPEventSelect sebelumnya untuk soket yang sama, dan menghapus rekaman peristiwa jaringan internal. Misalnya, untuk mengaitkan objek peristiwa dengan membaca dan menulis peristiwa jaringan, klien Windows Sockets SPI harus memanggil LPWSPEventSelect dengan FD_READ dan FD_WRITE, seperti ini.

rc = WSPEventSelect(s, hEventObject, FD_READ | FD_WRITE);

Tidak dimungkinkan untuk menentukan objek peristiwa yang berbeda untuk peristiwa jaringan yang berbeda. Kode berikut tidak akan berfungsi; panggilan kedua membatalkan efek yang pertama, dan satu-satunya asosiasi adalah peristiwa jaringan FD_WRITE yang terkait dengan hEventObject2.

// Incorrect example.
rc = WSPEventSelect(s, hEventObject1, FD_READ);
rc = WSPEventSelect(s, hEventObject2, FD_WRITE);

Untuk membatalkan asosiasi dan pemilihan peristiwa jaringan pada soket, Anda harus mengatur lNetworkEvents ke nol, dalam hal ini parameter hEventObject diabaikan.

rc = WSPEventSelect(s, hEventObject, 0);

Menutup soket dengan LPWSPCloseSocket juga membatalkan asosiasi dan pemilihan peristiwa jaringan yang ditentukan dalam LPWSPEventSelect untuk soket. Namun, klien Windows Sockets SPI masih harus memanggil WSACloseEvent untuk secara eksplisit menutup objek peristiwa, dan membebaskan sumber daya apa pun.

Karena soket LPWSPAccept'ed memiliki properti yang sama dengan soket mendengarkan yang digunakan untuk menerimanya, setiap asosiasi LPWSPEventSelect dan pemilihan peristiwa jaringan yang ditetapkan untuk soket mendengarkan berlaku untuk soket yang diterima. Misalnya, jika soket mendengarkan memiliki asosiasi LPWSPEventSelecthEventObject dengan FD_ACCEPT, FD_READ, dan FD_WRITE, maka soket apa pun yang diterima pada soket mendengarkan tersebut juga akan memiliki peristiwa jaringan FD_ACCEPT, FD_READ, dan FD_WRITE yang terkait dengan hEventObject yang sama. Jika hEventObject atau peristiwa jaringan yang berbeda diinginkan, maka klien Windows Sockets SPI harus memanggil LPWSPEventSelect, meneruskan soket yang diterima, dan informasi baru yang diinginkan.

Setelah berhasil merekam terjadinya peristiwa jaringan dan memberi sinyal objek peristiwa terkait, tidak ada tindakan lebih lanjut yang diambil untuk peristiwa jaringan tersebut sampai klien Windows Sockets SPI melakukan panggilan fungsi yang secara implisit mengaktifkan kembali pengaturan peristiwa jaringan tersebut dan sinyal objek peristiwa terkait.

Peristiwa jaringan Mengaktifkan kembali fungsi
FD_READ LPWSPRecv atau LPWSPRecvFrom
FD_WRITE LPWSPSend atau LPWSPSendTo
FD_OOB LPWSPRecv atau LPWSPRecvFrom
FD_ACCEPT LPWSPAccept, kecuali kode kesalahan yang dikembalikan WSATRY_AGAIN menunjukkan bahwa fungsi kondisi dikembalikan CF_DEFER
FD_CONNECT TIDAK ADA
FD_CLOSE TIDAK ADA
FD_QOS LPWSPIoctl dengan SIO_GET_QOS
FD_GROUP_QOS Dicadangkan untuk digunakan di masa mendatang dengan grup soket: LPWSPIoctl dengan SIO_GET_GROUP_QOS
FD_ROUTING_INTERFACE_CHANGE LPWSPIoctl dengan perintah SIO_ROUTING_INTERFACE_CHANGE
FD_ADDRESS_LIST_CHANGE LPWSPIoctl dengan SIO_ADDRESS_LIST_CHANGE perintah

Setiap panggilan ke mengaktifkan kembali rutinitas, bahkan yang gagal, mengakibatkan pengaktifan kembali perekaman dan sinyal untuk peristiwa jaringan dan objek peristiwa yang relevan, masing-masing.

Untuk peristiwa jaringan FD_READ, FD_OOB, dan FD_ACCEPT, perekaman peristiwa jaringan dan sinyal objek peristiwa dipicu tingkat. Ini berarti bahwa jika rutinitas pengaktifan kembali dipanggil, dan kondisi jaringan yang relevan masih valid setelah panggilan, maka peristiwa jaringan direkam dan objek peristiwa terkait disinyalir. Ini memungkinkan klien Windows Sockets SPI untuk digerakkan oleh peristiwa sekaligus tidak peduli dengan jumlah data yang tiba kapan saja. Pertimbangkan urutan berikut ini.

  1. Penyedia layanan menerima 100 byte data pada soket, merekam peristiwa jaringan FD_READ, dan memberi sinyal objek peristiwa terkait.
  2. Klien Windows Sockets SPI bermasalah WSPRecv(s, buffptr, 50, 0) untuk membaca 50 byte.
  3. Penyedia layanan merekam peristiwa jaringan FD_READ, dan memberi sinyal objek peristiwa terkait lagi karena masih ada data yang akan dibaca.

Dengan semantik ini, klien Windows Sockets SPI tidak perlu membaca semua data yang tersedia sebagai respons terhadap peristiwa jaringan FD_READ. Sebaliknya, satu LPWSPRecv sebagai respons terhadap setiap peristiwa jaringan FD_READ sesuai.

Peristiwa FD_QOS dan FD_GROUP_QOS dianggap dipicu tepi. Pesan akan diposting tepat sekali ketika perubahan kualitas layanan (QOS) terjadi. Indikasi lebih lanjut tidak akan dikeluarkan sampai penyedia layanan mendeteksi perubahan lebih lanjut di QOS, atau klien Windows Sockets SPI menegosiasikan ulang QOS untuk soket.

Peristiwa FD_ROUTING_INTERFACE_CHANGE dan FD_ADDRESS_LIST_CHANGE juga dianggap dipicu tepi . Pesan akan diposting tepat sekali ketika perubahan terjadi setelah klien Windows Sockets SPI meminta pemberitahuan dengan mengeluarkan WSAIoctl dengan SIO_ROUTING_INTERFACE_CHANGE atau SIO_ADDRESS_LIST_CHANGE yang sesuai. Pesan lebih lanjut tidak akan masuk sampai klien Windows Sockets SPI menerbitkan kembali IOCTL dan perubahan lain terdeteksi sejak IOCTL dikeluarkan.

Jika peristiwa jaringan telah terjadi ketika klien Windows Sockets SPI memanggil LPWSPEventSelect, atau ketika fungsi pengaktifan kembali dipanggil, maka peristiwa jaringan direkam dan objek peristiwa terkait disinyalkan, sebagaimana merujuk. Misalnya, pertimbangkan urutan berikut.

  1. Klien Windows Sockets SPI memanggil LPWSPListen.
  2. Permintaan koneksi diterima, tetapi belum diterima.
  3. Klien Windows Sockets SPI memanggil LPWSPEventSelect yang menentukan bahwa klien tertarik pada peristiwa jaringan FD_ACCEPT untuk soket. Penyedia layanan merekam peristiwa jaringan FD_ACCEPT, dan segera memberi sinyal objek peristiwa terkait.

Peristiwa jaringan FD_WRITE ditangani sedikit berbeda. Peristiwa jaringan FD_WRITE direkam ketika soket pertama kali terhubung dengan LPWSPConnect atau diterima dengan LPWSPAccept, dan kemudian setelah LPWSPSend atau LPWSPSendTo gagal dengan WSAEWOULDBLOCK dan ruang buffer tersedia. Oleh karena itu, klien Windows Sockets SPI dapat mengasumsikan bahwa pengiriman dimungkinkan mulai dari pengaturan peristiwa jaringan FD_WRITE pertama, dan berlangsung hingga pengiriman mengembalikan WSAEWOULDBLOCK. Setelah kegagalan seperti itu, klien Windows Sockets SPI akan menemukan bahwa pengiriman kembali dimungkinkan ketika peristiwa jaringan FD_WRITE direkam dan objek peristiwa terkait disinyalkan.

Peristiwa jaringan FD_OOB hanya digunakan saat soket dikonfigurasi untuk menerima data di luar band secara terpisah. Jika soket dikonfigurasi untuk menerima data out-of-band sejajar, maka data out-of-band (dipercepat) diperlakukan sebagai data normal, dan klien Windows Sockets SPI harus mendaftarkan minat, dan akan mendapatkan, FD_READ peristiwa jaringan, bukan FD_OOB peristiwa jaringan. Klien Windows Sockets SPI dapat mengatur atau memeriksa cara di mana data out-of-band akan ditangani dengan menggunakan LPWSPSetSockOpt atau LPWSPGetSockOpt untuk opsi SO_OOBINLINE.

Kode kesalahan dalam peristiwa jaringan FD_CLOSE menunjukkan apakah penutupan soket anggun, atau abortif. Jika kode kesalahan adalah 0, maka penutupannya adalah anggun; jika kode kesalahan adalah WSAECONNRESET, maka sirkuit virtual soket diatur ulang. Ini hanya berlaku untuk soket berorientasi koneksi seperti SOCK_STREAM.

Peristiwa jaringan FD_CLOSE direkam ketika indikasi dekat diterima untuk sirkuit virtual yang sesuai dengan soket. Dalam istilah TCP, ini berarti bahwa FD_CLOSE direkam ketika koneksi masuk ke status FIN WAIT atau CLOSE WAIT. Hasil ini dari akhir jarak jauh yang melakukan LPWSPShutdown di sisi pengiriman, atau LPWSPCloseSocket.

Penyedia layanan hanya boleh merekam peristiwa jaringan FD_CLOSE untuk menunjukkan penutupan sirkuit virtual; seharusnya tidak merekam peristiwa jaringan FD_READ untuk menunjukkan kondisi tersebut.

Peristiwa jaringan FD_QOS atau FD_GROUP_QOS direkam ketika telah ada perubahan pada bidang apa pun dalam spesifikasi alur yang terkait dengan soket , atau grup soket milik masing-masing. Perubahan ini harus tersedia untuk klien Windows Sockets SPI melalui fungsi LPWSPIoctl dengan SIO_GET_QOS dan/atau SIO_GET_GROUP_QOS untuk mengambil QOS saat ini untuk soket , atau untuk grup soket milik masing-masing.

Peristiwa jaringan FD_ROUTING_INTERFACE_CHANGE direkam ketika antarmuka lokal yang harus digunakan untuk mencapai tujuan yang ditentukan di WSAIoctl dengan perubahan SIO_ROUTING_INTERFACE_CHANGE setelah IOCTL tersebut diterbitkan.

Peristiwa jaringan FD_ADDRESS_LIST_CHANGE direkam ketika daftar alamat keluarga protokol soket tempat klien Windows Sockets SPI dapat mengikat perubahan setelahWSAIoctl dengan SIO_ADDRESS_LIST_CHANGE diterbitkan.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 10 Build 20348
Server minimum yang didukung Windows 10 Build 20348
Header ws2spi.h

Lihat juga

LPWSPEnumNetworkEvents