2011-04-08 64 views
2

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

在Windows上,当你释放端口,它停留在TIME_WAIT一些配置的超时。这里有一个注册表设置,'HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay' – 2011-04-08 13:32:36

+0

根据谁关闭连接,Time_wait可能发生在服务器或客户端,可能让客户端在意这一点? – 2011-04-08 13:37:35

+0

http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/建议对TCP进行一些更改以解决此问题。我不认为他的想法是成功的,但有关于这个问题的一些细节。 – 2011-04-08 13:44:47

回答

0

你需要更具体一些,因为很难知道你在做什么。较短的文本和代码示例会有所帮助。

我需要打开和关闭连接,然后再重新打开它们

这不应该是一个问题,如果它在客户端。如果是服务器端,请解释原因。

服务器上的配置文件正在寻找一个特定的端口,所以当我重新我需要相同的端口打开再次

你是什么意思?如果你的意思是监听端口:你不应该关闭监听端口。如果你不想接受多个插座,根本就没有再次直到客户端套接字已断开了的呼叫Accept

+0

你是说杀死接受EndAccept的套接字吗? – VengefulSakhmet 2011-04-08 16:22:08

+0

相同的套接字应该调用'BeginAccept'和'EndAccept' =>监听套接字。该套接字应该在应用程序的生命周期中生存。当连接关闭时,应由客户端套接字“EndAccept”返回的套接字关闭。 – jgauffin 2011-04-08 18:38:17

0

我读TIME_WAIT应该阻止我完全绑定,但这似乎不是真的。

有可以使用,让你绑定一个本地端口在TIME_WAIT一个选项。这是非常有用的,以确保你没有重新启动前杀死了服务器后要等待4分钟。

int flag = 1; 
sockfd = socket(...); 
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); 
bind(...); 
-2

之前关闭套接字,请您务必阅读其对端发送数据,否则会留在TIME_WAIT,以确保新的插座将无法读取用于先前的数据(封闭的)。你也可以尝试套接字没有延续的选项。

详情:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738547%28v=vs.85%29.aspx

+0

实际上并非如此;好吧,它是混乱的。有关详细信息,请参见http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-implications-for-protocols-and-scalable-servers.html。 – 2012-02-02 09:05:13

+0

这是完全不真实的。待处理的数据与TIME_WAIT无关。当您关闭套接字时,它全部被丢弃,并且所有到达的数据都会导致发生复位。 – EJP 2015-08-20 00:29:14

+0

哇,那是我的一个真正的旧帖子......复活;) 我站好了! – mBardos 2015-09-08 18:14:02