Aracılığıyla paylaş


Windows Soketleri: Engelleme

Bu makale ve iki yardımcı makale, Windows Yuvaları programlamadaki çeşitli sorunları açıklar. Bu makale engellemeyi kapsar. Diğer sorunlar şu makalelerde ele alınmıştır: Windows Yuvaları: Bayt Sıralama ve Windows Yuvaları: Dizeleri Dönüştürme.

CAsyncSocket sınıfını kullanıyor veya sınıfından türetirseniz, bu sorunları kendiniz yönetmeniz gerekir. CSocket sınıfını kullanır veya bu sınıftan türetilirseniz, MFC bunları sizin için yönetir.

Engelleme

Bir yuva "engelleme modunda" veya "engellemesiz modda" olabilir. Engelleme (veya zaman uyumlu) modundaki yuvaların işlevleri, eylemlerini tamamlayıncaya kadar geri dönmez. "Fonksiyonu çağrılan soket, çağrı dönene kadar hiçbir şey yapamayacağı için engellenmiştir, bu nedenle bu durum engelleme olarak adlandırılır." Örneğin, Receive üye işlevine yapılan bir çağrının tamamlanması, eğer CSocket kullanıyorsanız veya CAsyncSocket engellemeli olarak kullanıyorsanız, gönderen uygulamanın göndermesini beklediğinden belirsiz şekilde uzun sürebilir. Bir CAsyncSocket nesne engellemesiz moddaysa (zaman uyumsuz olarak çalışıyor), çağrı hemen döndürür ve GetLastError üye işleviyle alınabilen geçerli hata kodu WSAEWOULDBLOCK olur ve çağrının mod nedeniyle hemen döndürülmemesi durumunda engellendiğini gösterir. (CSocket hiçbir zaman WSAEWOULDBLOCK döndürmez. Sınıf sizin için engellemeyi kontrol eder.)

Yuvaların davranışı, 32 bit ve 64 bit işletim sistemlerinin (Windows 95 veya Windows 98 gibi) altında 16 bit işletim sistemlerinden (Windows 3.1 gibi) farklıdır. 16 bit işletim sistemlerinden farklı olarak, 32 bit ve 64 bit işletim sistemleri preemptive multitasking kullanır ve çoklu iş parçacığı kullanımı sağlar. 32 bit ve 64 bit işletim sistemlerinin altında yuvalarınızı ayrı çalışan iş parçacıklarına yerleştirebilirsiniz. Bir iş parçacığındaki soket, uygulamanızdaki diğer etkinliklere müdahale etmeden ve engellemenin işlem süresi harcamasına izin vermeden engel oluşturabilir. Çok iş parçacıklı programlama hakkında bilgi için Çoklu iş parçacığı kullanımı makalesine bakın.

Uyarı

Çok iş parçacıklı uygulamalarda, kullanıcı arabiriminin yanıt verebilirliğini etkilemeden, programınızın tasarımını basitleştirmek için CSocket'in bloke edici doğasını kullanabilirsiniz. Ana iş parçacığındaki kullanıcı etkileşimlerini işleyerek ve CSocket alternatif iş parçacıklarında işleyerek, bu mantıksal işlemleri ayırabilirsiniz. Çok iş parçacıklı olmayan bir uygulamada, bu iki etkinliği birleştirip tek bir iş parçacığı olarak ele almak gerekir. Bu, genellikle iletişim isteklerini isteğe bağlı olarak işlemek için CAsyncSocket kullanmak veya uzun süreli senkron etkinlik sırasında kullanıcı eylemlerini işlemek için CSocket::OnMessagePending geçersiz kılmak anlamına gelir.

Bu tartışmanın geri kalanı, 16 bit işletim sistemlerini hedefleyen programcılar içindir:

Normalde CAsyncSocket kullanıyorsanız, engelleme işlemlerini kullanmaktan kaçınmanız ve bunun yerine zaman uyumsuz çalışmanız tavsiye edilir. Zaman uyumsuz işlemlerde, örneğin çağrısının ardından Receive hata kodunu aldığınız noktadan itibaren, üye işleviniz OnReceive çağrılarak yeniden okuyabileceğinizi size bildirmek için beklersiniz. Zaman uyumsuz çağrılar, soketinizin uygun geri çağırma bildirim işlevi olan OnReceive gibi bir işlevi geri çağırarak yapılır.

Windows altında, engelleme çağrıları kötü bir uygulama olarak kabul edilir. Varsayılan olarak, CAsyncSocket zaman uyumsuz çağrıları destekler ve geri arama bildirimlerini kullanarak engellemeyi kendiniz yönetmeniz gerekir. CSocket sınıfı ise zaman uyumludur. Windows iletilerini iletir ve bloklamayı sizin için yönetir.

Engelleme hakkında daha fazla bilgi için bakınız Windows Soketler belirtimi. "Aktif" işlevleri hakkında daha fazla bilgi için Windows Yuvaları: Yuva Bildirimleri ve Windows Yuvaları: Yuva Sınıflarından Türetme bölümüne bakın.

Daha fazla bilgi için bakınız:

Ayrıca bakınız

MFC'de Windows Sockets
CAsyncSocket::OnSend