2013-03-12 14 views
17

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?

+0

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

+0

"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

+0

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

cevap

11

kapatma soket bağlantısını kapatır ve kapatmak, böylece, genel olarak

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 

yeterli olmalı, imhası etrafında sarıcı-yöntemdir. Bazıları, Kapat uygulamasının bir gününü değiştirebileceğini (bu nedenle artık Atma'yı aramayacak) ve Close'u aradıktan sonra Elle at'ı aramanız gerektiğini iddia edebilir, ancak kişisel olarak bunun gerçekleşeceğinden şüphe etmeliyim :)

Alternatif olarak, şunu kullanarak kullanmayı düşünün: yeh):

using (var socket = new Socket(...)) 
{ 
    .... 
    socket.Shutdown(SocketShutdown.Both); 
} 
İlgili konular