Belirsiz bir süre için veriyi ileri geri itmeyi amaçlayan bir istemci/sunucu ilişkisi üzerinde çalışıyorum.C soketindeki bağlantı kesilmesi nasıl tespit edilir C#
Üstesinden gelmeye çalıştığım sorun, istemci tarafındadır, çünkü bağlantıyı kesmenin bir yolunu bulmayı başaramam.
Sadece IO İstisnalarını yakalamadan, üç Seçme Noktasının her birinde soket yoklamaya kadar, diğer insanların çözümlerinde birkaç geçiş yaptım. Ayrıca, bir anketin bir kombinasyonunu kullanarak, soketin 'Uygun' alanına bir kontrol ile çalıştım. Sunucu tarafında
// Something like this
Boolean IsConnected()
{
try
{
bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead);
bool part2 = (this.Connection.Client.Available == 0);
if (part1 & part2)
{
// Never Occurs
//connection is closed
return false;
}
return true;
}
catch(IOException e)
{
// Never Occurs Either
}
}
, bir 'boş' karakteri yazmak için bir girişim (\ 0) müşteriye bir IO İstisna zorlar ve sunucu istemci (oldukça kolay konser) bağlantıyı kestiğini tespit edebilir.
İstemci tarafında aynı işlem bir istisna getirmez.
// Something like this
Boolean IsConnected()
{
try
{
this.WriteHandle.WriteLine("\0");
this.WriteHandle.Flush();
return true;
}
catch(IOException e)
{
// Never occurs
this.OnClosed("Yo socket sux");
return false;
}
}
Ben anket yoluyla bağlantı kesme saptanmasında yaşıyorum inanıyoruz bir sorun, benim sunucu henüz beri müşteriye geri hiçbir şey yazmadı, ben oldukça kolay bir SelectRead üzerinde sahte karşılaşmak olmasıdır
son kontrol ... Burada ne yapacağından emin değilim, bulabildiğim bu saptamayı yapmak için her seçeneği takip ettim ve hiçbir şey benim için% 100 olmadı ve sonuçta benim amacım bir sunucuyu (veya bağlantıyı) tespit etmektir) başarısızlık, müşteriyi bilgilendirmek, yeniden bağlanmak için beklemek, vb. Bu yüzden bunun bir ayrılmaz parça olduğunu hayal edebileceğinizden eminim.
Herkesin önerilerini takdir edin. Zamanın önündedir.
DÜZENLEME: Bu soruyu görüntüleyen herkes, aşağıdaki cevabı ve bunun için FİNAL Yorumlarım'a dikkat etmelidir. Bu sorunun üstesinden nasıl geldiğimi açıklığa kavuşturdum, ancak henüz 'Q & A' stili bir gönderi yaptık.
Sadece IOExceptions'ı yakalayın ve bir zaman aşımı kullanın. Diğer tüm bu anahtarlığa ihtiyacın yok. – EJP
Bunu zaten denedim (yazımı gerçekten okumadınız ...) ve isabetli ya da özledim. Bir saniyeden sonra zaman aşımına uğrayan bir okuma işlemi bir bağlantı kesme işlemini zorlayan bir IO'ya neden olur ... Ama ya veri almamış olsaydım ...? – DigitalJedi805
Yazınızı okudum. 'Vur ve kaçır' değil, hem lokal hem de uzaktan tamponlama yapan asenkron veriye tabidir. Başarısız bir bağlantının ilk yazısında, henüz algılanmadığından, bir istisna alamazsınız: TCP, yeniden deneme girişimlerini zamanladıktan sonra, sonraki bir yazıda alırsınız. – EJP