Bagikan melalui


I/O dan Objek Peristiwa yang Tumpang Tindih

Windows Sockets 2 mendukung I/O yang tumpang tindih dan semua penyedia transportasi mendukung kemampuan ini. I/O yang tumpang tindih mengikuti model yang dibuat di Windows dan dapat dilakukan pada soket yang dibuat dengan fungsi soket atau soket yang dibuat dengan fungsi WSASocket dengan bendera WSA_FLAG_OVERLAPPED diatur dalam parameter dwFlags .

Catatan

Membuat soket dengan atribut yang tumpang tindih tidak berdampak pada apakah soket saat ini dalam mode pemblokiran atau nonblocking. Soket yang dibuat dengan atribut tumpang tindih dapat digunakan untuk melakukan I/O yang tumpang tindih—melakukannya tidak mengubah mode pemblokiran soket. Karena operasi I/O yang tumpang tindih tidak memblokir, mode pemblokiran soket tidak relevan untuk operasi ini.

 

Untuk menerima, aplikasi menggunakan fungsi WSARecv atau WSARecvFrom untuk memasok buffer tempat data akan diterima. Jika satu atau beberapa buffer diposting sebelum waktu ketika data telah diterima oleh jaringan, data tersebut dapat ditempatkan di buffer pengguna segera saat data tiba. Dengan demikian, ini dapat menghindari operasi salin yang jika tidak akan terjadi pada saat fungsi recv atau recvfrom dipanggil. Jika data sudah ada saat menerima buffer diposting, data akan segera disalin ke buffer pengguna.

Jika data tiba ketika tidak ada buffer penerima yang telah diposting oleh aplikasi, resor jaringan ke gaya operasi sinkron yang akrab. Artinya, data masuk di-buffer secara internal sampai aplikasi mengeluarkan panggilan terima dan dengan demikian memasok buffer tempat data dapat disalin. Pengecualian untuk ini adalah ketika aplikasi menggunakan setsockopt untuk mengatur ukuran buffer penerima ke nol. Dalam hal ini, protokol yang andal hanya akan memungkinkan data diterima ketika buffer aplikasi telah diposting dan data pada protokol yang tidak dapat diandalkan akan hilang.

Di sisi pengirim, aplikasi menggunakan WSASend atau WSASendTo untuk menyediakan pointer ke buffer yang diisi dan kemudian setuju untuk tidak mengganggu buffer dengan cara apa pun sampai jaringan telah menggunakan konten buffer.

Kirim dan terima panggilan yang tumpang tindih segera kembali. Nilai pengembalian nol menunjukkan bahwa operasi I/O segera diselesaikan dan indikasi penyelesaian yang sesuai sudah terjadi. Artinya, objek peristiwa terkait telah diberi sinyal, atau rutinitas penyelesaian telah diantrekan dan akan dijalankan ketika utas panggilan masuk ke status tunggu yang dapat diwaspadai.

Nilai pengembalian SOCKET_ERROR digabungkan dengan kode kesalahan WSA_IO_PENDING menunjukkan bahwa operasi yang tumpang tindih telah berhasil dimulai dan bahwa indikasi berikutnya akan diberikan ketika buffer pengiriman telah dikonsumsi atau ketika operasi terima telah selesai. Namun, untuk soket yang bergaya byte-stream, indikasi penyelesaian terjadi setiap kali data masuk habis, terlepas dari apakah buffer penuh. Kode kesalahan lainnya menunjukkan bahwa operasi yang tumpang tindih tidak berhasil dimulai dan tidak ada indikasi penyelesaian yang akan datang.

Operasi kirim dan terima dapat tumpang tindih. Fungsi penerima dapat dipanggil beberapa kali untuk memposting buffer penerima sebagai persiapan untuk data masuk, dan fungsi kirim dapat dipanggil beberapa kali untuk mengantre beberapa buffer untuk dikirim. Meskipun aplikasi dapat mengandalkan serangkaian buffer pengiriman yang tumpang tindih yang dikirim dalam pesanan yang disediakan, indikasi penyelesaian yang sesuai mungkin terjadi dalam urutan yang berbeda. Demikian juga, di sisi penerimaan, buffer dapat diisi dalam urutan yang disediakan, tetapi indikasi penyelesaian mungkin terjadi dalam urutan yang berbeda.

Dalam banyak kasus, operasi Winsock yang tumpang tindih menggunakan AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile, dan fungsi serupa dapat dibatalkan. Namun, perilaku tidak terdefinisi untuk penggunaan berkelanjutan soket yang telah membatalkan operasi yang luar biasa. Fungsi closesocket harus dipanggil setelah membatalkan operasi yang tumpang tindih. Oleh karena itu, untuk hasil terbaik, alih-alih membatalkan I/O secara langsung, fungsi closesocket harus dipanggil untuk menutup soket yang akhirnya akan menghentikan semua operasi yang tertunda.

Fitur penyelesaian yang ditangguhkan dari I/O yang tumpang tindih juga tersedia untuk WSAIoctl, yang merupakan versi ioctlsocket yang ditingkatkan.