pilih fungsi (winsock2.h)
Fungsi pilih menentukan status satu atau beberapa soket, menunggu jika perlu, untuk melakukan I/O sinkron.
Sintaks
int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
Parameter
[in] nfds
Diabaikan. Parameter nfds hanya disertakan untuk kompatibilitas dengan soket Berkeley.
[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 memilih untuk menunggu, disediakan dalam bentuk struktur TIMEVAL . Atur parameter batas waktu ke null untuk operasi pemblokiran.
Mengembalikan nilai
Fungsi select mengembalikan jumlah total handel soket yang siap dan terkandung dalam struktur fd_set , nol jika batas waktu kedaluwarsa, atau SOCKET_ERROR jika terjadi kesalahan. Jika nilai yang dikembalikan SOCKET_ERROR, WSAGetLastError dapat digunakan untuk mengambil kode kesalahan tertentu.
Kode kesalahan | Makna |
---|---|
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini. | |
Implementasi 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. | |
Subsistem jaringan gagal. | |
Nilai waktu habis tidak valid, atau ketiga parameter deskriptor null. | |
Panggilan Windows Socket 1.1 pemblokiran dibatalkan melalui WSACancelBlockingCall. | |
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Salah satu set deskriptor berisi entri yang bukan soket. |
Keterangan
Fungsi select 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 . Soket yang terkandung dalam struktur fd_set harus dikaitkan dengan satu penyedia layanan. Untuk tujuan pembatasan ini, soket dianggap berasal dari penyedia layanan yang sama jika 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. Fungsi pilih mengembalikan jumlah soket yang memenuhi kondisi. Sekumpulan makro disediakan untuk memanipulasi struktur 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 dalam status mendengarkan , soket akan ditandai sebagai dapat dibaca jika permintaan koneksi masuk telah diterima sehingga penerimaan dijamin selesai tanpa memblokir. Untuk soket lain, keterbacaan berarti bahwa data yang diantrekan tersedia untuk dibaca sedunia sehingga panggilan ke recv, WSARecv, WSARecvFrom, atau recvfrom dijamin tidak akan memblokir.
Untuk soket berorientasi koneksi, keterbacaan juga dapat menunjukkan bahwa permintaan untuk menutup soket telah diterima dari serekan. Jika sirkuit virtual ditutup dengan lancar, dan semua data diterima, maka recv akan segera kembali dengan pembacaan nol byte. Jika sirkuit virtual direset, maka recv akan segera selesai dengan kode kesalahan seperti WSAECONNRESET. Kehadiran data OOB akan diperiksa apakah opsi soket SO_OOBINLINE telah diaktifkan (lihat setsockopt).
Parameter writefds mengidentifikasi soket yang akan diperiksa untuk writability. Jika soket memproses panggilan sambungkan (tidak memblokir), soket dapat ditulis jika pembentukan koneksi berhasil diselesaikan. Jika soket tidak memproses panggilan sambungkan , writability berarti kirim, kirim ke, atau WSASendto dijamin berhasil. Namun, mereka dapat memblokir soket pemblokiran jika parameter 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.
Singkatnya, soket akan diidentifikasi dalam set tertentu saat memilih mengembalikan jika:
readfds:
- Jika mendengarkan telah dipanggil dan koneksi tertunda, terima akan berhasil.
- Data tersedia untuk dibaca (termasuk data OOB jika SO_OOBINLINE diaktifkan).
- Koneksi telah ditutup/direset/dihentikan.
- Jika memproses panggilan sambungkan (tidak memblokir), koneksi telah berhasil.
- Data dapat dikirim.
- Jika memproses panggilan sambungkan (tidak memblokir), upaya koneksi gagal.
- Data OOB tersedia untuk dibaca (hanya jika SO_OOBINLINE dinonaktifkan).
- FD_ZERO(*set) - Menginisialisasi diatur ke set kosong. Satu set harus selalu dibersihkan sebelum digunakan.
- FD_CLR, *set) - Menghapus soket dari set.
- FD_ISSET, *set) - Memeriksa untuk melihat apakah s adalah anggota set dan mengembalikan TRUE jika demikian.
- FD_SET, *set) - Menambahkan soket untuk diatur.
Parameter time-out mengontrol berapa lama waktu yang diperlukan untuk menyelesaikan pilihan. Jika waktu habis adalah penunjuk null , pilih 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 dipilih harus menunggu sebelum kembali. Saat memilih kembali, konten struktur TIMEVAL tidak diubah. Jika TIMEVAL diinisialisasi ke {0, 0}, pilih akan segera kembali; ini digunakan untuk melakukan polling status soket yang dipilih. Jika pilih segera kembali, maka panggilan pilih dianggap tidak memblokir dan asumsi standar untuk panggilan nonblocking berlaku. Misalnya, kait pemblokiran tidak akan dipanggil, dan Windows Sockets tidak akan menghasilkan.
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
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 | winsock2.h |
Pustaka | Ws2_32.lib |
DLL | Ws2_32.dll |