Fungsi panggilan balik LPWSPSELECT (ws2spi.h)

Fungsi LPWSPSelect menentukan status satu atau beberapa soket.

Sintaks

LPWSPSELECT Lpwspselect;

int Lpwspselect(
  [in]      int nfds,
  [in, out] fd_set *readfds,
  [in, out] fd_set *writefds,
  [in, out] fd_set *exceptfds,
  [in]      const timeval *timeout,
  [out]     LPINT lpErrno
)
{...}

Parameter

[in] nfds

Diabaikan dan disertakan hanya demi kompatibilitas.

[in, out] readfds

Penunjuk opsional ke sekumpulan soket yang akan diperiksa keterbacaannya.

[in, out] writefds

Penunjuk opsional ke sekumpulan soket yang akan diperiksa untuk mendapatkan wribilitas.

[in, out] exceptfds

Penunjuk opsional ke sekumpulan soket yang akan diperiksa kesalahannya.

[in] timeout

Waktu maksimum untuk LPWSPSelect untuk menunggu, atau null untuk operasi pemblokiran, dalam bentuk struktur timeval .

[out] lpErrno

Arahkan ke kode kesalahan.

Mengembalikan nilai

Fungsi LPWSPSelect mengembalikan jumlah total deskriptor yang siap dan terkandung dalam struktur fd_set , atau SOCKET_ERROR jika terjadi kesalahan. Jika nilai yang dikembalikan SOCKET_ERROR, kode kesalahan tertentu tersedia di lpErrno.

Kode Kesalahan Makna
WSAEFAULT
Penyedia layanan Windows Sockets tidak dapat mengalokasikan sumber daya yang diperlukan untuk operasi internalnya, atau readfd, writefd,exceptfds atau parameter timeval bukan bagian dari ruang alamat pengguna.
WSAENETDOWN
Subsistem jaringan gagal.
WSAEINVAL
Nilai batas waktu tidak valid, atau ketiga parameter deskriptor adalah NULL.
WSAEINTR
(Pemblokiran) panggilan dibatalkan melalui LPWSPCancelBlockingCall.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAENOTSOCK
Salah satu set deskriptor berisi entri yang bukan soket.

Keterangan

Fungsi ini digunakan untuk menentukan status satu atau beberapa soket. Untuk setiap soket, pemanggil dapat meminta informasi tentang status baca, tulis, atau kesalahan. Kumpulan soket yang statusnya diminta ditunjukkan oleh struktur fd_set . Semua entri dalam fd_set sesuai dengan soket yang dibuat oleh penyedia layanan (yaitu, struktur WSAPROTOCOL_INFO yang menjelaskan protokol mereka memiliki nilai providerId yang sama). Setelah kembali, struktur diperbarui untuk mencerminkan subset soket ini yang memenuhi kondisi yang ditentukan, dan LPWSPSelect mengembalikan jumlah total soket yang memenuhi kondisi. Sekumpulan makro disediakan untuk memanipulasi fd_set. Makro ini kompatibel dengan yang digunakan dalam perangkat lunak Berkeley, tetapi representasi yang mendasar benar-benar berbeda.

Parameter readfds mengidentifikasi soket yang akan diperiksa keterbacaannya. Jika soket saat ini mendengarkan melalui LPWSPListen, soket akan ditandai sebagai dapat dibaca jika permintaan koneksi masuk telah diterima, sehingga LPWSPAccept dijamin selesai tanpa memblokir. Untuk soket lain, keterbacaan berarti bahwa data yang diantrekan tersedia untuk dibaca sehingga LPWSPRecv atau LPWSPRecvFrom dijamin tidak akan memblokir.

Untuk soket berorientasi koneksi, keterbacaan juga dapat menunjukkan bahwa permintaan dekat telah diterima dari serekan. Jika sirkuit virtual ditutup dengan anggun, maka LPWSPRecv akan segera kembali dengan pembacaan nol byte. Jika sirkuit virtual direset, maka LPWSPRecv akan segera selesai dengan kode kesalahan, seperti WSAECONNRESET. Keberadaan data OOB akan diperiksa apakah opsi soket SO_OOBINLINE telah diaktifkan (lihat LPWSPSetSockOpt).

Writefd parameter mengidentifikasi soket yang akan diperiksa untuk writability:

Namun, mereka dapat memblokir pada soket pemblokiran jika lensa melebihi jumlah ruang buffer sistem keluar yang tersedia. Tidak ditentukan berapa lama jaminan ini dapat diasumsikan valid, terutama di lingkungan multithreaded.

Parameter exceptfds mengidentifikasi soket yang akan diperiksa keberadaan data OOB atau kondisi kesalahan yang luar biasa. Perhatikan bahwa data OOB hanya akan dilaporkan dengan cara ini jika opsi SO_OOBINLINE FALSE. Jika soket membuat koneksi LPWSPConnect (nonblocking), kegagalan upaya koneksi ditunjukkan dalam exceptfds. Spesifikasi ini tidak menentukan kesalahan lain mana yang akan disertakan.

Setiap dua readfd, writefd, atau exceptfd dapat diberikan sebagai null jika tidak ada deskriptor yang akan diperiksa untuk kondisi yang menarik. Setidaknya satu harus non-null, dan set deskriptor non-null harus berisi setidaknya satu deskriptor soket.

Ringkasan: Soket akan diidentifikasi dalam set tertentu ketika LPWSPSelect kembali sesuai dengan yang berikut ini.

Parameter Deskripsi
readfds: Jika LPWSPListen dipanggil, koneksi tertunda, LPWSPAccept akan berhasil. Data tersedia untuk dibaca (termasuk data OOB jika SO_OOBINLINE diaktifkan). Koneksi telah ditutup/direset/dihentikan.
writefds: Jika LPWSPConnect (nonblocking), koneksi telah berhasil. Data dapat dikirim.
exceptfds: Jika LPWSPConnect (nonblocking), upaya koneksi gagal. Data OOB tersedia untuk dibaca (hanya jika SO_OOBINLINE dinonaktifkan).

 

 

Tiga makro dan satu fungsi penarikan didefinisikan dalam file header Ws2spi.h untuk memanipulasi dan memeriksa set deskriptor. Variabel FD_SETSIZE menentukan jumlah maksimum deskriptor dalam satu set. (Nilai default FD_SETSIZE adalah 64, yang dapat dimodifikasi dengan #defining FD_SETSIZE ke nilai lain sebelum #including Ws2spi.h.) Secara internal, handel soket dalam fd_set tidak direpresentasikan sebagai bendera bit seperti di Berkeley UNIX. Representasi data mereka buram. Penggunaan makro ini akan mempertahankan portabilitas perangkat lunak di antara lingkungan soket yang berbeda.

Makro yang akan dimanipulasi dan diperiksa konten fd_set adalah:

FD_CLR, *set)

Menghapus deskriptor dariset.

FD_SET, *set)

Menambahkan deskriptor untukdiatur.

FD_ZERO(*set)

Menginisialisasi set ke set null .

Fungsi upcall yang digunakan untuk memeriksa keanggotaan adalah:

intWPUFDIsSet (SOCKETs, FD_SET FAR *set);

yang akan mengembalikan bukan nol jika s adalah anggota dari set atau nol.

Batas waktu parameter mengontrol berapa lama waktu yang dibutuhkan LPWSPSelect untuk menyelesaikannya. Jika batas waktu adalah penunjuk null , LPWSPSelect akan memblokir tanpa batas waktu hingga setidaknya satu deskriptor memenuhi kriteria yang ditentukan. Jika tidak, waktu habis menunjuk ke struktur timeval yang menentukan waktu maksimum yang harus ditunggu LPWSPSelect sebelum kembali. Ketika LPWSPSelect kembali, konten struktur timeval tidak diubah. Jika timeval diinisialisasi ke {0, 0}, LPWSPSelect akan segera kembali; ini digunakan untuk melakukan polling status soket yang dipilih. Jika demikian, maka panggilan LPWSPSelect dianggap tidak memblokir dan asumsi standar untuk panggilan nonblocking berlaku. Misalnya, hook pemblokiran tidak akan dipanggil, dan penyedia Windows Sockets tidak akan menghasilkan.

Catatan

Fungsi LPWSPSelect tidak berpengaruh pada persistensi peristiwa soket yang terdaftar di LPWSPAsyncSelect atau LPWSPEventSelect.

Persyaratan

   
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

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo