2012-08-01 9 views
7

İstemcinin TCP bağlantısıyla bağlandığı bir uygulama üzerinde çalışıyorum, bu da potansiyel olarak çok fazla zaman alabilecek bir işi tetikler. Kullanıcı TCP bağlantısını bıraktığında bu iş iptal edilmelidir.Kapalı bağlantıları algılamak için bir ağ akışına sıfır bayt yazmak güvenilir bir yol mu?

Şu anda, ne periyodik ağlarını kontrol eden bir zamanlayıcı başlatılırken yapıyorum bunu yaparak bağlantı akışları:

// stream is a Stream instance 
var abort = false; 
using (new Timer(x => { 
    try 
    { 
     stream.Write(new byte[0], 0, 0); 
    } 
    catch (Exception) 
    { 
     abort = true; 
    } 
}, null, 1000, 1000)) 
{ 
    // Do expensive work here and check abort periodically 
} 
okumak isterdi

CanWrite, CanRead veya Connected ancak rapor Akışın son durumu. Sıfır bayt yazma, bağlantıyı sınamak için güvenilir bir yol mu, yoksa bu da sorunlara neden olabilir mi? Akışta herhangi bir gerçek veri yazamıyorum ya da okuyamıyorum, çünkü bu müşteriyi dağıtacaktır.

cevap

3

Sadece on yıllarca işe yaradığını bildiğimi söyleyeyim, ama neden olması gerektiğine dair içsel bir sebep yok. Size ve TCP yığını arasındaki API katmanlarının Herhangi aşağı sonraki katmana çağrıyı bastırmak hakkına sahiptir ve bu yığının içine tüm yol alır bile sadece bir hata döndürür eğer:

  1. Kontrollerin Uygulamanın bağımlı olduğu sıfır uzunluğunu kontrol etmeden önce ağ hataları için ve
  2. Daha önceden yapılmış bir RST hatası veya önceki bir işlemden kaynaklanan bir ağ hatası oluştu.

Ağın sihirbazlığını diğer ucuna kadar genişletmesini bekliyorsanız, kesinlikle olmaz.

+0

Benim için çalışıyor gibi görünüyor, ama ben senin noktasını görebiliyorum. Tüm yolu araştırmayı beklemiyorum, ama eğer biraz giderse muhtemelen yeterince iyi olur. Bir yerlerde sıfırlama bağlantısı olup olmadığını söyleyen bir tür yerli bayrak olmalı? Bir olay ya da bir şey gerçekten güzel olurdu. – Dervall

+0

@Dervall Yığın sıfırlama olup olmadığını bilir, ancak hayatımda size verecek bir TCP API'sı görmedim. Hataları almak için TCP bağlantısında G/Ç yapmanız gerekir. Gerçekten bu şekilde tasarlandı: 'çevir sesi yok'. Ara düğüm hataları ve yeniden yönlendirmelerden kurtulmak için üretildi. – EJP

İlgili konular