We couldn’t sign you in
Select the account you want to use.

Ringkasan

Artikel ini menjelaskan perbedaan antara soket tumpang tindih I/O atribut dan soket memblokir atau nonblocking mode.

Informasi Selengkapnya

Ketika soket dibuat, secara default adalah soket pemblokiran. Anda dapat menggunakan perintah FIONBIO di ioctlsocket API panggilan, WSAEventSelect atau WSAAysncSelect untuk mengubah moda soket dari memblokir untuk nonblocking. Jika panggilan Winsock tidak dapat menyelesaikan segera, panggilan gagal dan WSAGetLastError mengembalikan galat WSAEWOULDBLOCK jika soket nonblocking, atau panggilan blok hingga operasi selesai jika pemblokiran soket. Atribut I/O soket tumpang tindih berbeda dari mode pemblokiran atau nonblocking soket. Meskipun implementasi Winsock saat ini memerlukan tumpang tindih I/O atribut untuk nonblocking soket mode, mereka secara konseptual independen dan model pemrograman mereka juga berbeda. Untuk membuat soket dengan atribut I/O tumpang tindih, Anda dapat menggunakan API soket atau WSASocket API dengan set bendera WSA_FLAG_OVERLAPPED. Jika operasi I/O tumpang tindih tidak dapat menyelesaikan segera, panggilan gagal dan WSAGetLastError atau GetLastError kembali WSA_IO_PENDING atau ERROR_IO_PENDING, yang sebenarnya sama define sebagai WSA_IO_PENDING. Untuk informasi tambahan, baca artikel berikut di Pangkalan Pengetahuan Microsoft:

179942 Info: WSA_FLAG_OVERLAPPED diperlukan untuk non-blocking soketHarap dicatat bahwa setelah soket dibuat, tidak ada cara untuk mengubah atribut tumpang tindih soket. Namun, Anda dapat memanggil setsockopt API dengan SO_OPENTYPE pilihan pada setiap soket menangani termasuk INVALID_SOCKET untuk mengubah atribut tumpang tindih untuk semua panggilan soket berturut-turut di thread yang sama. Nilai opsi SO_OPENTYPE asali adalah 0, yang menetapkan atribut tumpang tindih. Semua nilai bukan nol opsi membuat soket sinkron dan membuatnya sehingga Anda tidak dapat menggunakan fungsi selesai. Dengan menetapkan atribut I/O soket tumpang tindih tidak berarti bahwa soket akan melakukan operasi I/O tumpang tindih. Sebagai contoh, jika Anda menetapkan NULL untuk fungsi selesai dan struktur tumpang tindih di WSARecv dan WSASend, atau Anda hanya memanggil recv atau mengirim fungsi, mereka akan menyelesaikan dalam mode pemblokiran. Untuk memastikan I/O dilakukan dalam mode tumpang tindih Anda perlu menyediakan struktur tumpang tindih dalam fungsi I/O Anda, tergantung pada fungsi yang Anda gunakan.

Tumpang tindih I/O

Dalam Winsock 1, Anda membuat soket tumpang tindih menggunakan API soket, dan menggunakan Win32 berkas I/O API ReadFile, ReadFileEx, WriteFile, WriteFileEx untuk melakukan I/O tumpang tindih pada handle soket. Dalam Winsock 2, Anda membuat soket tumpang tindih menggunakan WSASocket dengan bendera WSA_FLAG_OVERLAPPED, atau hanya menggunakan API soket. Anda dapat menggunakan berkas Win32 di atas I/O api atau Winsock 2 WSASend, WSASendTo, WSARecv dan WSARecvFrom untuk memulai operasi I/O tumpang tindih. Jika Anda menggunakan opsi SO_RCVBUF dan SO_SNDBUF untuk mengatur tumpukan TCP nol menerima dan mengirim buffer, Anda pada dasarnya memerintahkan tumpukan TCP langsung melakukan I/O menggunakan buffer yang disediakan dalam panggilan I/O Anda. Oleh karena itu, selain keuntungan nonblocking I/O soket tumpang tindih, keuntungan lain adalah kinerja yang lebih baik karena Anda menyimpan salinan buffer antara buffer memori TCP dan buffer pengguna untuk setiap panggilan I/O. Tetapi Anda harus memastikan bahwa Anda tidak mengakses buffer pengguna setelah dikirimkan untuk tumpang tindih operasi dan sebelum tumpang tindih operasi selesai. Untuk menentukan apakah tumpang tindih pengoperasian I/O selesai, Anda dapat menggunakan salah satu dari opsi berikut ini:

  • Anda dapat menyediakan menangani peristiwa dalam struktur tumpang tindih yang digunakan dalam I/O panggilan dan menunggu pada pegangan peristiwa untuk sinyal.

  • Menggunakan GetOverlappedResult atau WSAGetOverlappedResult polling status operasi I/O tumpang tindih. Pada Windows NT, Anda dapat menentukan NULL sebagai peristiwa menangani struktur tumpang tindih. Namun, pada Windows 95 struktur tumpang tindih perlu berisi manual reset menangani peristiwa. WSAGetOverlappedResult pada Windows 98 dan Windows Millennium Edition (ME) diubah sedemikian rupa sehingga akan berperilaku seperti Windows NT dan juga dapat polling status penyelesaian dengan menangani peristiwa NULL dalam struktur tumpang tindih.

  • Gunakan ReadFileEx, WriteFileEx, WSARecv, WSARecvFrom, WSASend atau WSASendTo dan memilih untuk memberikan fungsi selesai untuk dipanggil saat operasi I/O tumpang tindih selesai. Jika Anda menggunakan pendekatan fungsi penyelesaian, pada beberapa titik setelah Anda telah mengeluarkan operasi I/O tumpang tindih Anda perlu mengeluarkan fungsi tunggu Win32 atau versi WSA menunggu fungsi untuk menunggu pada menangani nonsignaled untuk menempatkan thread saat ini ke keadaan alertable menunggu. Ketika operasi I/O tumpang tindih selesai, fungsi penyelesaian Anda disebut, fungsi tunggu Anda akan kembali WAIT_IO_COMPLETION, dan thread menunggu alertable terbangun.

  • Menggunakan GetQueuedCompletionStatus dan mengaitkan soket, bersama dengan menetapkan atribut I/O tumpang tindih, dengan Windows NT I/O penyelesaian Port (IOCP). Dengan IOCP, Anda tidak perlu menyediakan fungsi penyelesaian, menunggu pada menangani peristiwa untuk sinyal, atau jajak pendapat status operasi tumpang tindih. Setelah Anda membuat IOCP dan menambahkan Anda menangani tumpang tindih soket IOCP, Anda dapat memulai operasi tumpang tindih dengan menggunakan salah satu I/O api yang disebutkan di atas (kecuali recv, recvfrom, kirim, atau SendTo). Anda akan memiliki blok thread pekerja pada GetQueuedCompletionStatus API menunggu paket penyelesaian I/O. Ketika selesai I/O tumpang tindih, paket penyelesaian I/O tiba di IOCP dan GetQueuedCompletionStatus kembali. IOCP adalah Windows NT Operating System dukungan untuk menulis scalable, throughput tinggi server menggunakan threading sangat sederhana dan memblokir kode pada operasi I/O tumpang tindih. Dengan demikian dapat menjadi keuntungan kinerja yang signifikan menggunakan tumpang tindih soket I/O dengan Windows NT IOCPs.

Pemblokiran dan nonblocking mode

Ketika soket dibuat, secara default adalah soket pemblokiran. Di bawah memblokir mode pengoperasian I/O soket, sambungkan dan terima operasi semua blok hingga operasi yang dimaksud selesai. Untuk mengubah mode operasi soket dari memblokir mode nonblocking mode, Anda dapat menggunakan WSAAsyncSelect, WSAEventSelect atau perintah FIONBIO ioctlsocket API panggilan. WSAAsyncSelect peta soket pemberitahuan ke jendela pesan dan model terbaik untuk aplikasi GUI berulir tunggal. WSAEventSelect menggunakan WSAEnumNetworkEvents untuk menentukan sifat pemberitahuan soket pada peristiwa sinyal dan peta soket pemberitahuan dengan sinyal peristiwa. Ini adalah model yang berguna untuk aplikasi non-GUI yang tidak memiliki pompa pesan, seperti aplikasi layanan Windows NT. Perintah FIONBIO di ioctlsocket API panggilan menempatkan soket ke mode nonblocking serta. Tapi Anda perlu polling status soket dengan menggunakan pilih API. Update: pengaturan SO_RCVBUF ke nol dengan recv tumpang tindih tidak diperlukan untuk Windows 2000, yang dapat langsung menyalin data ke aplikasi recv buffer. Pengaturan SO_SNDBUF ke nol dengan tumpang tindih kirim pada Windows 2000 masih memiliki manfaat yang sama menyimpan satu salinan memori seperti pada Windows NT 4,0. Hal ini juga penting bahwa aplikasi masalah beberapa beredar tumpang tindih kirim ' s atau recv's jika aplikasi menetapkan buffer tumpukan sesuai ke 0.

Perlu bantuan lainnya?

Kembangkan keterampilan Anda
Jelajahi pelatihan
Dapatkan fitur baru terlebih dahulu
Gabung Microsoft Insider

Apakah informasi ini bermanfaat?

Seberapa puaskah Anda dengan kualitas bahasanya?
Apa yang memengaruhi pengalaman Anda?

Terima kasih atas umpan balik Anda!

×