Bir tcp soketi için socket.Close() kullanılması, soketi tamamen kapatmıyor gibi görünüyor. Aşağıdaki örnekte açılmayan 9999 numaralı bağlantı noktasında example.com'a bağlanmaya çalışıyorum ve kısa bir zamanaşımından sonra soketi kapatmaya çalışıyorum.Soket.Close, tcp soketini gerçekten kapatmıyor mu? (C#)
TCP israel-xp:6506 www.example.com:9999 SYN_SENT
TCP israel-xp:6507 www.example.com:9999 SYN_SENT
TCP israel-xp:6508 www.example.com:9999 SYN_SENT
TCP israel-xp:6509 www.example.com:9999 SYN_SENT
DÜZENLEME : döngü tamamlandıktan sonra netstat bakmak zaman
for (int i = 0; i < 200; i++)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.LingerState = new LingerOption(false, 0);
sock.BeginConnect("www.example.com", 9999, OnSocketConnected, sock);
System.Threading.Thread.Sleep(50);
sock.Close();
}
Ama birçok yarı açılmış prizler olduğunu bulmak. Tamam, bazı bağlam eksik. Başlangıç bağlantısı kullanıyorum çünkü soket bağlantısının başarısız olmasını bekliyorum (9999 açık değil) ve gerçek kodumda, bir zamanlayıcı ayarlandığında prizi çağıracağım.Close(). OnSocketConnected Üzerine EndConnect'i arayarak bir istisna atar (atılan nesnenin yöntemini çağırmaya çalışmak). Amacım soket bağlantı aşaması için kısa bir zaman aşımı yaşıyor.
Neyi yanlış yaptığımı bir ipucu? Teşekkürler!
bu mantıklı, ancak yalancı oyalama ayarlamamalı mı? – r0u1i
oh, linger bunu yapmaz. Yani, Windows soketi sonlandırmak için gerçekten bir yol yoktur. – r0u1i
varsayılan olarak, Windows gerçekten kapatmadan önce FIN_WAIT durumunda 4 dakika boyunca oturacaktır. Daha da ilginç olan ise, aynı hedef/port pencerelerine başka bir bağlantıyı tekrar açarsanız, eşleşen FIN_WAIT bağlantılarını yeniden kullanır. – Jay