首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Time_Wait中的端口卡住

Time_Wait中的端口卡住
EN

Stack Overflow用户
提问于 2011-04-08 20:54:40
回答 3查看 5.3K关注 0票数 4

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

在第二次、第三次、第n次连接上,根据我等待重新连接的时间长短,我在绑定套接字时收到一个10048错误代码-“地址已在使用”。在关闭套接字时,我确实执行了ShutDown.Both和Close,希望清除端口,但是当我在命令提示符中执行netstat时,我仍然发现端口保存在TIME_WAIT中。我还将套接字设置为无延迟。最后,我尝试创建一个循环来检查端口的状态,但它以一个无穷无尽的循环结束。我在想这是4分钟的TIME_WAIT规则。

我有一个显示新状态查询的函数,我发现当我运行该查询并检查,直到端口从ESTABLISHED进入我可以绑定的TIME_WAIT,但是当我使用该查询中的相同数据在状态达到TIME_WAIT的循环上绑定时,我得到了10048。我的按钮点击是否允许一个短暂的时间来允许我绑定?在TIME_WAIT和ESTABLISHED之间有没有一种状态,我在循环中点击,而不是在点击按钮时?我读到TIME_WAIT应该完全阻止我绑定,但这似乎不是真的。有人能解释这个吗?

我向你们这些代码爱好者道歉。不过,我不认为这会改变任何事情。我只需要更好地了解港口状态。

代码语言:javascript
复制
    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
EN

回答 3

Stack Overflow用户

发布于 2011-04-08 21:00:05

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

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

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

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

你是什么意思?如果您指的是侦听端口:您永远不应该关闭侦听器套接字。如果您不想接受多个套接字,那么在客户端套接字断开连接之前,不要再次调用Accept

票数 0
EN

Stack Overflow用户

发布于 2011-04-20 20:44:44

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

您可以使用一个选项来绑定TIME_WAIT中的本地端口。这是非常有用的,以确保您不必等待4分钟后杀死一个服务器,然后重新启动它。

代码语言:javascript
复制
int flag = 1;
sockfd = socket(...);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
bind(...);
票数 0
EN

Stack Overflow用户

发布于 2012-02-02 16:58:47

在关闭套接字之前,您必须读取它的对等方发送的所有数据,否则它将停留在TIME_WAIT中,以确保新的套接字不会读取前一个套接字(已关闭的套接字)的数据。您还可以尝试使用套接字的无延迟选项。

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5595331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档