卡住我有一个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