Bagikan melalui


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:

Baca juga

Windows Sockets di MFC
CAsyncSocket::OnSend