繁体   English   中英

停留在Time_Wait中的港口

[英]Port Stuck in Time_Wait

我在C#中有一个TCP隧道。 我需要打开和关闭隧道,这是我的服务器和客户端之间的应用程序。 我正在使用它来关闭数据连接以测试另一个应用程序。 我必须使用特定的端口。

在第二,第三,第n个连接上,具体取决于我等待重新连接的时间,在绑定套接字时,我会收到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

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

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

如果它在客户端中,那应该不成问题。 如果是服务器端,请说明原因。

服务器上的配置文件正在寻找特定的端口,因此当我重新连接时,我需要再次打开相同的端口

你什么意思? 如果您的意思是侦听端口:切勿关闭侦听器套接字。 如果您不想接受多个套接字,只需在客户端套接字断开连接之前就不要再次调用Accept

我读到TIME_WAIT应该完全阻止我绑定,但这似乎不正确。

您可以使用一个选项来绑定TIME_WAIT中的本地端口。 这对于确保您不必在杀死服务器后等待4分钟再重新启动服务器很有用。

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

关闭套接字之前,必须先读取其对等方发送的所有数据,否则它将保留在TIME_WAIT中,以确保新的套接字不会读取用于先前(关闭的)套接字的数据。 您也可以尝试使用套接字的no持久选项。

详细信息: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/ms738547%28v=vs.85%29.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM