udpclient.close并不总是关闭套接字?

时间:2009-07-22 13:44:16

标签: c# sockets

我正在使用下面的代码,似乎有时套接字没有发布

我是怎么发现的? 通过使用进程资源管理器(来自sysinternal), 关于申请的礼仪 然后进入TCP / IP选项卡。

我可以通过在控制台中输入“netstat -a”来查看正在使用的端口

我的问题是,经过一段时间(比如5周),应用程序使用了40个端口,而它应该为零。

任何人都知道为什么会这样做?

    public void Connect()
    {
        try {
            // Resolve server address
            IPHostEntry hostadd = Dns.GetHostEntry(TimeServer);
            IPEndPoint EPhost = new IPEndPoint(hostadd.AddressList[0], 123);

            //Connect the time server
            UdpClient TimeSocket = new UdpClient();
            TimeSocket.Connect(EPhost);

            TimeSocket.Send(SNTPData, SNTPData.Length);
            SNTPData = TimeSocket.Receive(ref EPhost);                
            TimeSocket.Close();
            if (!IsResponseValid())
            {
                throw new Exception("Invalid response from " + TimeServer);
            }

        } catch(SocketException e)
          {
            throw new Exception(e.Message);
          }

    }

1 个答案:

答案 0 :(得分:1)

你永远阻止:

SNTPData = TimeSocket.Receive(ref EPhost);  

如果套接字从未收到数据包,它将一直等到进程终止。

您需要通过在另一个线程上调用TimeSocket.Close()或使用SetSocketOption在接收​​上设置超时来关闭套接字。

相关问题