看來,使用socket.Close()爲一個TCP套接字,並沒有完全關閉套接字。在下面的示例中,我試圖連接到端口9999處的example.com,該端口未打開,並在短暫超時後嘗試關閉套接字。Socket.Close並不真的關閉tcp socket嗎? (c#)
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();
}
但是當我看看netstat的循環完成後,我發現有很多半開的插座:
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
編輯 。好吧,一些情況下丟失。我正在使用beginconnect,因爲我期望套接字連接失敗(9999未打開),並且在我的真實代碼中,一旦定時器被設置,我就調用socket.Close()。 On OnSocketConnected我調用了EndConnect,它引發一個異常(試圖調用一個處理對象的方法)。 我的目標是在套接字連接階段有一個短暫的超時。
任何線索我在做什麼錯? 謝謝!
這是有道理的,但不是徘徊於虛假應該解決嗎? – r0u1i 2010-01-06 18:22:29
哦,逗留不這樣做。所以,沒有辦法讓Windows終止套接字。 – r0u1i 2010-01-07 13:33:21
默認情況下,它將在Windows真正關閉之前處於FIN_WAIT狀態4分鐘。更有意思的是,如果你重新打開另一個連接到相同的目的地/端口窗口將重用FIN_WAIT中匹配的連接。 – Jay 2010-08-25 19:35:48