Soket bağlantısının sözde kapatılıp temizlenmesini sağlayan Soket nesnesindeki ilgili yöntemlerin bereketiyle biraz kafam karıştı. Aşağıdaki düşünün: AyrıcaBir Soket bağlantısını kapatmak ve temizlemek için uygun yol nedir?
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("192.168.1.22", 8333);
socket.Send(Encoding.UTF8.GetBytes("hello"));
// now for the closing fun
socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(false);
socket.Close();
socket.Dispose();
, this guy gerçekten temiz bir bağlantı kapatmak için, bir, socket.Shutdown(SocketShudown.Send)
yürütmek zorundadır diğer tarafı cevap için bekleyin söylüyor.
Kapatmanın doğru yolu nedir, daha sonra soket bağlantısını temizleyin?
Bu adam yarısı doğru. Bence ikisi arasındaki protokollere bağlı. Hala bir süre için almaya devam edecekseniz evet ise, diğer tarafa kapatma konusundaki niyetinizi söylemelisiniz ve göndermeyi bırakacağınızı ancak yine de alabileceğinizi söylemelisiniz. Sunucu kodumu benzer şekilde modellediğim için – uriDium
"bu adam" çoğunlukla doğru. Ancak, yarı-yakın-bekleme yaklaşımının sadece asenkron (bloke olmayan) soketler için gerekli olduğuna inanıyorum. Bloke edici olmayan soketlere inandığınızda "Gönder" i hemen ardından Kapat ile çağırırsınız, yeniden iletilmesi gereken paketler varsa veri kaybının meydana gelebileceği bazı kenar koşulları vardır. – selbie
Soket sunucumda karma bir yaklaşım kullandım. Sunucu önce bağlantıyı yarı-kapalı olacak ve istemcinin yapıldığını göstermek için 0 ya da hata döndürmek üzere recv() öğesini bekleyecektir. Bununla birlikte, son taramadan bu yana kalan tüm yarı açık bağlantıları süpürmek ve kapatmak için her 45 saniyede bir periyodik olarak sönen bir zamanlayıcım var. – selbie