Soket Windows: Pemblokiran
Artikel ini dan dua artikel pendamping menjelaskan beberapa masalah dalam pemrograman Windows Sockets. Artikel ini membahas pemblokiran. Masalah lain tercakup dalam artikel: Windows Sockets: Byte Ordering dan Windows Sockets: Mengonversi String.
Jika Anda menggunakan atau berasal dari kelas CAsyncSocket, Anda harus mengelola masalah ini sendiri. Jika Anda menggunakan atau berasal dari CSocket kelas, MFC mengelolanya untuk Anda.
Pemblokiran
Soket dapat berada dalam "mode pemblokiran" atau "mode nonblocking." Fungsi soket dalam mode pemblokiran (atau sinkron) tidak kembali sampai mereka dapat menyelesaikan tindakan mereka. Ini disebut pemblokiran karena soket yang fungsinya disebut tidak dapat melakukan apa pun — diblokir — sampai panggilan kembali. Panggilan ke Receive
fungsi anggota, misalnya, mungkin membutuhkan waktu yang lama untuk diselesaikan karena menunggu aplikasi pengiriman dikirim (ini adalah jika Anda menggunakan CSocket
, atau menggunakan CAsyncSocket
dengan pemblokiran). CAsyncSocket
Jika objek berada dalam mode nonblocking (beroperasi secara asinkron), panggilan segera kembali dan kode kesalahan saat ini, dapat diambil dengan fungsi anggota GetLastError, adalah WSAEWOULDBLOCK, yang menunjukkan bahwa panggilan akan diblokir jika tidak segera dikembalikan karena mode. (CSocket
tidak pernah mengembalikan WSAEWOULDBLOCK. Kelas mengelola pemblokiran untuk Anda.)
Perilaku soket berbeda di bawah sistem operasi 32-bit dan 64-bit (seperti Windows 95 atau Windows 98) daripada di bawah sistem operasi 16-bit (seperti Windows 3.1). Tidak seperti sistem operasi 16-bit, sistem operasi 32-bit dan 64-bit menggunakan multitugas preemtif dan menyediakan multithreading. Di bawah sistem operasi 32-bit dan 64-bit, Anda dapat menempatkan soket Anda di utas pekerja terpisah. Soket dalam utas dapat memblokir tanpa mengganggu aktivitas lain dalam aplikasi Anda dan tanpa menghabiskan waktu komputasi pada pemblokiran. Untuk informasi tentang pemrograman multithreaded, lihat artikel Multithreading.
Catatan
Dalam aplikasi multithread, Anda dapat menggunakan sifat pemblokiran CSocket
untuk menyederhanakan desain program Anda tanpa memengaruhi respons antarmuka pengguna. Dengan menangani interaksi pengguna di utas utama dan CSocket
pemrosesan di utas alternatif, Anda dapat memisahkan operasi logis ini. Dalam aplikasi yang tidak multithreaded, kedua aktivitas ini harus digabungkan dan ditangani sebagai satu utas, yang biasanya berarti menggunakan CAsyncSocket
sehingga Anda dapat menangani permintaan komunikasi sesuai permintaan, atau mengambil alih CSocket::OnMessagePending
untuk menangani tindakan pengguna selama aktivitas sinkron yang panjang.
Sisa diskusi ini adalah untuk programmer yang menargetkan sistem operasi 16-bit:
Biasanya, jika Anda menggunakan CAsyncSocket
, Anda harus menghindari penggunaan operasi pemblokiran dan beroperasi secara asinkron sebagai gantinya. Dalam operasi asinkron, dari titik di mana Anda menerima kode kesalahan WSAEWOULDBLOCK setelah memanggil Receive
, misalnya, Anda menunggu sampai fungsi anggota Anda OnReceive
dipanggil untuk memberi tahu Anda bahwa Anda dapat membaca lagi. Panggilan asinkron dilakukan dengan memanggil kembali fungsi pemberitahuan panggilan balik yang sesuai soket Anda, seperti OnReceive.
Di bawah Windows, pemblokiran panggilan dianggap praktik buruk. Secara default, CAsyncSocket mendukung panggilan asinkron, dan Anda harus mengelola pemblokiran sendiri menggunakan pemberitahuan panggilan balik. Kelas CSocket, di sisi lain, sinkron. Ini memompa pesan Windows dan mengelola pemblokiran untuk Anda.
Untuk informasi selengkapnya tentang pemblokiran, lihat spesifikasi Windows Sockets. Untuk informasi selengkapnya tentang fungsi "Aktif", lihat Windows Sockets: Socket Notifications dan Windows Sockets: Turun dari Kelas Soket.
Untuk informasi selengkapnya, lihat: