Bagikan melalui


Fungsi panggilan balik LPWSPSELECT (ws2spi.h)

Fungsi LPWSPSelect menentukan status satu atau beberapa soket.

Sintaksis

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 ditulis.

[in, out] exceptfds

Penunjuk opsional ke sekumpulan soket yang akan diperiksa kesalahannya.

[in] timeout

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

[out] lpErrno

Penunjuk 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 pengembalian SOCKET_ERROR, kode kesalahan tertentu tersedia di lpErrno.

Kode Kesalahan Arti
WSAEFAULT
Penyedia layanan Windows Sockets tidak dapat mengalokasikan sumber daya yang diperlukan untuk operasi internalnya, atau readfd , writefds, exceptfds atau parameter timeval bukan bagian dari ruang alamat pengguna.
WSAENETDOWN
Subsistem jaringan gagal.
WSAEINVAL
Nilai batas waktu tidak valid, atau ketiga parameter deskriptor 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.

Komentar

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 sama sekali berbeda.

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

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

Parameter writefds mengidentifikasi soket yang akan diperiksa untuk ditulis:

  • Jika soket tersambung melalui LPWSPConnect, writability berarti bahwa pembentukan koneksi berhasil diselesaikan.
  • Jika soket tidak dalam proses mendengarkan melalui LPWSPConnect, writability berarti bahwa LPWSPSend atau LPWSPSendTo dijamin berhasil.

Namun, mereka dapat memblokir 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 kecualifds. Spesifikasi ini tidak menentukan kesalahan lain mana yang akan disertakan.

Setiap dua readfd, writefds, atau kecualifd 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 saat LPWSPSelect mengembalikan 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 (tidak memblokir), koneksi telah berhasil. Data dapat dikirim.
exceptfds : Jika LPWSPConnect (tidak memblokir), upaya koneksi gagal. Data OOB tersedia untuk dibaca (hanya jika SO_OOBINLINE dinonaktifkan).

 

 

Tiga makro dan satu fungsi upcall 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 oleh #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 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 ke set .

FD_ZERO(*set)

Menginisialisasi set ke set null .

Fungsi upcall yang digunakan untuk memeriksa keanggotaan adalah:

intWPUFDIsSet (SOCKETs, FD_SETFARset);

yang akan mengembalikan nonzero jika s adalah anggota yang ditetapkan atau nol.

Parameter batas waktu mengontrol berapa lama LPWSPSelect dapat menyelesaikannya. Jika batas waktu adalah penunjuk null , LPWSPSelect akan memblokir tanpa batas waktu hingga setidaknya satu deskriptor memenuhi kriteria yang ditentukan. Jika tidak, batas waktu menunjuk ke struktur timeval yang menentukan waktu maksimum yang LPWSPPilih harus menunggu sebelum kembali. Saat 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, 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.

Nota

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

Persyaratan

Syarat 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

LPWSPConnect

LPWSPEventPilih

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo