2016-04-14 50 views
0

Sunucunun istemciye veri gönderdiği ve istemcinin verileri geri gönderdiği bir sunucu/istemci uygulaması oluşturmaya çalışıyorum. Ama nedense, veri yazmadan zarif olmayan bir bağlantıyı nasıl algılayacağımı bilmediğim için çalışmayı başaramıyorum (arabellek, ihtiyacım olmayan yanlış verilerle doldurulacağından veri yazamıyorum). Bunu yapmanın başka bir yolu var mı? TCP kullanıyorum.Yetkisiz bir bağlantıyı kesmek için C#

+1

TCP bağlantı kesintilerini hassas bir şekilde işlemek için tasarlanmıştır. TCP'nin kaybolmuş bağlantılardan kurtulma yeteneği bir özellik değil, bir hatadır. Başka bir şekilde ifade etmek gerekirse: herhangi bir iletişim yoksa, * bağlantı kesilmez *. Diğer tarafın hala hayatta olup olmadığını bilmeniz gerektiğinde geleneksel çözüm, protokole periyodik bir kalp atışı eklemektir: başka hiçbir şey yapmayan, diğer tarafın hala yanıt yoluyla var olduğunu doğrulayan bir operasyon. Böyle bir işlem yoksa, insanlar bazen sıfır bayt yazıyor, ancak bu tam olarak güvenilir değil. –

cevap

0

Güvenilir olmayan bir ağda TCP bağlantılarının davranışını açıklıyorsunuz. Yani başka bir protokol kullanmanız gerekiyor. Ben sorunu tam anlayamadım

TCP C#

+0

Güvenilir bir ağdır, ancak sunucu bağlantısı kesilirse tüm istemcileri el ile yeniden bağlamak istemiyorum. –

+0

hangi protokolü kullanıyorsunuz? –

+0

Üzgünüz cevabınızı yanlış anladım. Ben zaten TCP kullanıyorum. –

0

göz at, ancak soket hala bağlı olup olmadığını kontrol edebilir:

public bool IsSocketConnected(Socket socket) { 
    return !(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0) && socket.Connected; 
} 
+0

Teşekkürler. Bu, zarif bir bağlantı kesme için çalışır. Ancak, yetkisiz bir bağlantı kesme için değil. (sunucu ağı rasgele ayrıldığında) –

+0

Bir zaman aşımına karar vermek (örnekte olduğu gibi "0" dışında) pragmatik bir çözüm olabilir. Eğer bir bağlantı kesiksiz bir şekilde kesilirse, “hayatta kalan” taraf, durumu değiştirmek için kelime aldıkça (bu kelimenin bağlantısının kesildiği taraftan gelmesi gerekmediği için) bağlı durumda tutulur. bir zaman aşımı mekanizması tanıtıldı. – kasperhj

0

Bir KeepAlive ile çözdüm işlevi.