Soket Overtoç G/Ç karşı engelleme/engellemez modu

Özet

Bu makalede, bir soketin çakışan G/Ç özniteliği ile soketin engelleme veya engellememe modu arasındaki fark açıklanmaktadır.

Ek Bilgi

Bir soket oluşturulduğunda, varsayılan olarak bir engelleme soketidir. IOCTLSocket API çağrısında, WSAEventSelect veya WSAAysncSelect'te, soket modunu engellemeden engellememeye değiştirmek için FIONBIO komutunu kullanabilirsiniz. Winsock çağrısı hemen tamamlanamıyorsa, arama başarısız olur ve WSAGetLastError, engelleyici olmayan bir soketse WSAEWOULDBLOCK hatası döndürür veya engelleme soketi yse işlem tamamlanana kadar arama blokları. Ç/Ç özniteliği çakışan soket, soketin engelleme veya engellememe modundan farklıdır. Geçerli Winsock uygulaması, engelleyici olmayan soket modu için çakışan G/Ç özniteliği gerektirmese de, kavramsal olarak bağımsızdır lar ve programlama modelleri de farklıdır. Çakışan G/Ç özelliğine sahip bir soket oluşturmak için, WSA_FLAG_OVERLAPPED bayrak kümesiyle soket API'sını veya WSASocket API'sini kullanabilirsiniz. Çakışan bir G/Ç işlemi hemen tamamlanamazsa, arama başarısız olur ve WSAGetLastError veya GetLastError return WSA_IO_PENDING veya ERROR_IO_PENDING,aslında WSA_IO_PENDING ile aynı tanımdır. Daha fazla bilgi için lütfen Microsoft Bilgi Bankası'ndaki aşağıdaki makaleye bakın:

179942 BİlGİ: WSA_FLAG_OVERLAPPED Engelleyici Olmayan Soketler Için GereklidirBir soket oluşturulduktan sonra, soketin üst üste bindirilen özniteliğini değiştirmenin bir yolu olmadığını lütfen unutmayın. Ancak, aynı iş parçacığındaki tüm ardışık soket çağrılarıiçin çakışan öznitelikleri değiştirmek için INVALID_SOCKET dahil olmak üzere herhangi bir soket tutamaçları üzerinde SO_OPENTYPE seçeneği ile setsockopt API arayabilirsiniz. Varsayılan SO_OPENTYPE seçenek değeri, çakışan özniteliği ayarlayan 0'dır. Sıfır olmayan tüm seçenek değerleri soketseni senkronize eder ve tamamlama işlevini kullanamamanızı sağlar. Bir soketin çakışan G/Ç özelliğini ayarlayarak, soketin çakışmış bir G/Ç işlemi gerçekleştireceği anlamına gelmez. Örneğin, WSARecv ve WSASend'deki hem tamamlama işlevi hem de çakışan yapı için NULL belirtirseniz veya yalnızca recv veya işlev gönderirseniz, bunlar engelleme şeklinde tamamlanacaktır. G/Ç'nin çakışan bir şekilde gerçekleştirildiğinden emin olmak için, kullandığınız işleve bağlı olarak G/Ç işlevinizde çakışan bir yapı sağlamanız gerekir.

Çakışan G/Ç

Winsock 1'de, soket API'sini kullanarak çakışmış bir soket oluşturur sunuz ve soket kolunda çakışan G/Ç'yi gerçekleştirmek için Win32 file I/O API ReadFile, ReadFileEx, WriteFileEx, WriteFileEx'i kullanıyorsunuz. Winsock 2'de WSA_FLAG_OVERLAPPED bayrağıyla WSASocket kullanarak veya yalnızca soket API'sını kullanarak çakışan bir soket oluşturursunuz. Yukarıdaki Win32 file G/O API'lerini veya Winsock 2 WSASend, WSASendTo, WSARecv ve WSARecvFrom'u kullanarak çakışan bir G/Ç işlemi başlatabilirsiniz. Sıfır TCP yığını alma ve arabellek göndermek için SO_RCVBUF ve SO_SNDBUF seçeneğini kullanıyorsanız, temelde G/Ç aramanızda sağlanan arabelleği kullanarak G/Ç'yi doğrudan gerçekleştirmesi için TCP yığınına talimat verirsiniz. Bu nedenle, çakışan soket G/Ç'nin engellenmeme avantajına ek olarak, TCP yığın arabelleği ile her G/Ç çağrısı için kullanıcı arabelleği arasında bir arabellek kopyasını kaydettiğiniz için diğer avantaj daha iyi performanstır. Ancak, üst üste bindirilen işlem için gönderildikten ve üst üste binme işlemi tamamlanmadan önce kullanıcı arabelleği'ne erişmediğinden emin olabilirsiniz. Çakışan G/Ç işleminin tamamlanıp tamamlanmadığını belirlemek için aşağıdaki seçeneklerden birini kullanabilirsiniz:

  • G/Ç çağrısında kullanılan çakışan bir yapıda olay tutamacı sağlayabilir ve sinyal vermek için olay tutamacını bekleyebilirsiniz.

  • Üst üste binen G/Ç işleminin durumunu yoklamak için GetOverlappedResult veya WSAGetOverlappedResult'ı kullanın. Windows NT'de, üst üste binen yapıdaki olay kolu olarak NULL'u belirtebilirsiniz. Ancak, Windows 95'te çakışan yapının el ile sıfırlama olay tanıtıcısı içermesi gerekir. WSAGetOverlappedResult Windows 98 ve Windows Millennium Edition (ME) windows NT gibi olacak ve aynı zamanda çakışan yapıda bir NULL olay kolu ile tamamlama durumunu yoklayabilirsiniz şekilde değiştirilir.

  • ReadFileEx, WriteFileEx, WSARecv, WSARecvFrom, WSASend veya WSASendTo'yu kullanın ve çakışan G/Ç işlemi tamamlandığında çağrılacak bir tamamlama işlevi sağlamayı seçin. Tamamlama işlevi yaklaşımını kullanırsanız, çakışan G/Ç işlemini yayınladıktan sonra bir Win32 bekleme işlevi veya geçerli iş parçacığınızı uyarılabilir bir bekleme durumuna koymak için sinyalsiz bir tutamacıbeklemek için bekleme işlevinin WSA sürümünü düzenlemeniz gerekir. Çakışan G/Ç işlemi tamamlandığında, tamamlama işleviniz çağrılır, bekleme işleviniz WAIT_IO_COMPLETION'ı döndürecek ve uyarılanabilir bekleme iş parçacığınız uyanır.

  • GetQueuedCompletionStatus'ü kullanın ve bir soketi, çakışan G/Ç öznitelik kümesiyle birlikte bir Windows NT G/Ç Tamamlama Bağlantı Noktası (IOCP) ile ilişkilendirin. IOCP ile, bir tamamlama işlevi sağlamanız, sinyal vermek için bir olay tutamacıbeklemeniz veya çakışan işlemin durumunu yoklamanız gerekmez. IOCP'yi oluşturduktan ve çakışan soket sapınızı IOCP'ye ekledikten sonra, yukarıda belirtilen G/Ç API'lerinden herhangi birini kullanarak çakışan işlemi başlatabilirsiniz (recv, recvfrom, send veya sendto hariç). GetQueuedCompletionStatus API'de işçi iş parçacığı bloğunuz Bir G/Ç tamamlama paketini bekliyor olacaktır. Çakışan bir G/Ç tamamlandığında, BIR G/Ç tamamlama paketi IOCP'ye gelir ve GetQueuedCompletionStatus döndürür. IOCP, çok basit iş parçacığı ve çakışan G/Ç işlemlerinde kod engelleme kullanarak ölçeklenebilir, yüksek iş gücü sunucusu yazmak için Windows NT İşletim Sistemi desteğidir. Böylece Windows NT IOC'ler ile çakışmış soket G/Ç kullanmanın önemli bir performans avantajı olabilir.

Engelleme ve engelleme metodsuzluk

Bir soket oluşturulduğunda, varsayılan olarak bir engelleme soketidir. Engelleme modu soket I/Ç işlemleri altında, söz konusu işlem tamamlanana kadar tüm bloktaki işlemleri bağlayın ve kabul edin. Soket çalışma modunu engelleme modundan engelleme moduna değiştirmek için, IOCTlsocket API çağrısında WSAAsyncSelect, WSAEventSelect veya FIONBIO komutunu kullanabilirsiniz. WSAAsyncSelect Windows iletileri için soket bildirimleri eşler ve tek bir iş parçacığı GUI uygulaması için en iyi modeldir. WSAEventSelect, sinyal olayındaki soket bildiriminin doğasını belirlemek için WSAEnumNetworkEvents kullanır ve bir olay sinyali vererek soket bildirimlerini eşler. Bu, Windows NT hizmet uygulaması gibi ileti pompası olmayan GUI olmayan uygulamalar için yararlı bir modeldir. IOCTLSocket API çağrısındaki FIONBIO komutu soketi engellemez moduna da sos koyar. Ancak, seçili API'yi kullanarak soketin durumunu yoklamanız gerekir. Güncelleştirme: So_RCVBUF'u üst üste bindirilen recv ile sıfıra ayarlamak, verileri doğrudan uygulamanın recv arabelleğine kopyalayabilen Windows 2000 için gerekli değildir. SO_SNDBUF'u Windows 2000'de üst üste gelen gönderilerle sıfıra ayarlamak, windows nt 4.0'daki gibi bir bellek kopyasını kaydetme avantajına sahiptir. Ayrıca, uygulama karşılık gelen yığın arabelleği 0'a ayarlarsa, uygulamanın birkaç önemli çakışan gönder veya recv's sorunları da önemlidir.

Daha fazla yardıma mı ihtiyacınız var?

Yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Microsoft Insider 'a katılın

Bu bilgi yardımcı oldu mu?

Geri bildiriminiz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×