卡住我有一個TCP隧道在C#。我需要打開和關閉服務器和客戶端之間的應用程序隧道。我正在使用這個關閉數據連接來測試另一個應用程序。我必須使用特定的端口。港TIME_WAIT
在第二,第三,第n個視我等多久才能重新連接時,我收到一個10048錯誤代碼 - 「地址已在使用」結合我的插座時。當關閉套接字,我不執行ShutDown.Both並清理出港口的希望關閉,但是當我在命令提示符下做了netstat的我仍然覺得在TIME_WAIT舉行的端口。我也設置插座不要流連忘返。最後我試圖做一個循環來檢查端口的狀態,但它在一個有點無盡的循環結束。我在想這是4分鐘的TIME_WAIT規則。
我有一個函數來顯示一個nestat查詢,我發現,當我運行它,並檢查,直到端口從ESTABLISHED進入TIME_WAIT,我可以綁定,但是當我使用這個查詢中的相同數據綁定循環時的狀態到達TIME_WAIT,我得到了10048有沒有被我按一下按鈕允許在一段短暫的瞬間,讓我綁定?有沒有TIME_WAIT之間的狀態,並建立我打的循環,而不是當我點擊按鈕做呢?我讀TIME_WAIT應該阻止我完全綁定,但這似乎不是真的。有人可以解釋這一點嗎?
我向你道歉代碼愛好者。不認爲這會改變任何事情。我只需要更好地瞭解端口狀態。
public bool CheckAvailablePorts()
{
int temp=0;
bool availPort= true;
m_config = new AppConfig();
if (!m_config.initialize())
{
System.Diagnostics.Debug.WriteLine("Error loading configuration file. Exiting...");
return false;
}
else
{
//checking through all the ports that have been set to connect on
foreach (ProxyConfig cfg in m_config.m_proxyConfigs)
{
availPort = true;
temp = cfg.localEP.Port;
DataView dv = FindEstablishedSockets();//returns netstat query
foreach (DataRowView rowView in dv)
{
DataRow row = rowView.Row;
if ((Convert.ToInt32(row["Local Port"].ToString()) == temp) && (row["Status"].ToString().Equals("Established")))
{
System.Diagnostics.Debug.WriteLine("Port: " + temp + " is still locked");
availPort = false;
break;
}
}
}
return availPort;
}
}
//snippet out of a bigger function which checks for availability and then sleeps if false and runs again
bool temp = false;
while (!temp)
{
temp = monitor.CheckAvailablePorts();
System.Threading.Thread.Sleep(2000);
}
System.Threading.Thread.Sleep(3000);
monitor.startApplication(); //starts all the binding
在Windows上,當你釋放端口,它停留在TIME_WAIT一些配置的超時。這裏有一個註冊表設置,'HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay' – 2011-04-08 13:32:36
根據誰關閉連接,Time_wait可能發生在服務器或客戶端,可能讓客戶端在意這一點? – 2011-04-08 13:37:35
http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/建議對TCP進行一些更改以解決此問題。我不認爲他的想法是成功的,但有關於這個問題的一些細節。 – 2011-04-08 13:44:47