Bagikan melalui


Windows Sockets: Memblokir

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 tidak memblokir." Fungsi soket dalam mode pemblokiran (atau sinkron) tidak akan kembali sampai dapat menyelesaikan tindakan mereka. Ini disebut pemblokiran karena soket yang fungsinya disebut tidak dapat melakukan apa pun — diblokir — sampai panggilan kembali. Panggilan ke fungsi anggota Receive, misalnya, mungkin membutuhkan waktu yang lama untuk diselesaikan karena menunggu aplikasi pengiriman untuk mengirim (ini terjadi jika Anda menggunakan CSocket, atau menggunakan CAsyncSocket dengan pemblokiran). CAsyncSocket Jika objek berada dalam mode nonblocking (beroperasi secara asinkron), panggilan akan langsung kembali dan kode kesalahan saat ini, yang dapat diambil dengan fungsi anggota GetLastError, adalah WSAEWOULDBLOCK, yang berarti bahwa panggilan akan terblokir jika tidak kembali langsung karena mode tersebut. (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. Dalam sistem operasi 32-bit dan 64-bit, Anda dapat menempatkan soket Anda pada thread pekerja secara 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.

Nota

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 "On", lihat Windows Sockets: Socket Notifications dan Windows Sockets: Mengambil dari Kelas Soket.

Untuk informasi selengkapnya, lihat:

Lihat juga

Windows Sockets pada MFC
CAsyncSocket::OnSend