我有一个用C#编写的TCP隧道。我需要打开和关闭该应用程序,该应用程序在服务器和客户端之间进行通信。我使用它来关闭数据连接以测试另一个应用程序。我必须使用特定的端口。
在第二个、第三个或更多个连接上,取决于我重新连接等待的时间长度,当我绑定套接字时,我会收到10048错误代码 -“地址已在使用中”。当关闭套接字时,我会执行ShutDown.Both和Close操作,以清除端口,但是当我在命令提示符中运行netstat时,我仍然发现端口处于TIME_WAIT状态。我还将套接字设置为不等待。最后,我尝试制作循环以检查端口的状态,但它以某种无限循环结束。我认为这是4分钟TIME_WAIT规则的问题。
我有一个显示nestat查询的函数,并发现当我运行该函数并检查端口是否从ESTABLISHED变为TIME_WAIT时,我可以绑定,但是当我使用此查询数据在循环中绑定时,当状态达到TIME_WAIT时,我会遇到10048错误。我的按钮单击是否允许我绑定的短暂时刻?在循环中是否存在TIME_WAIT和ESTABLISHED之间的状态,而在使用按钮单击时不存在?我读过TIME_WAIT应该完全阻止我进行绑定,但这似乎不是真的。有人能解释一下吗?
我向您代码爱好者道歉。虽然我认为这不会改变什么,但我需要更好地了解端口状态。
在第二个、第三个或更多个连接上,取决于我重新连接等待的时间长度,当我绑定套接字时,我会收到10048错误代码 -“地址已在使用中”。当关闭套接字时,我会执行ShutDown.Both和Close操作,以清除端口,但是当我在命令提示符中运行netstat时,我仍然发现端口处于TIME_WAIT状态。我还将套接字设置为不等待。最后,我尝试制作循环以检查端口的状态,但它以某种无限循环结束。我认为这是4分钟TIME_WAIT规则的问题。
我有一个显示nestat查询的函数,并发现当我运行该函数并检查端口是否从ESTABLISHED变为TIME_WAIT时,我可以绑定,但是当我使用此查询数据在循环中绑定时,当状态达到TIME_WAIT时,我会遇到10048错误。我的按钮单击是否允许我绑定的短暂时刻?在循环中是否存在TIME_WAIT和ESTABLISHED之间的状态,而在使用按钮单击时不存在?我读过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
HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay
。 - Chris O