c# - udpclient.close并不总是关闭套接字吗?

标签 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);
          }

    }

最佳答案

您将永远阻止:

SNTPData = TimeSocket.Receive(ref EPhost);  

如果套接字从未收到过数据包,它将坐在那里等待直到进程终止。

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

关于c# - udpclient.close并不总是关闭套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1165362/

相关文章:

c# - 尝试构建解决方案(对其进行调试)并收到错误消息,提示该.exe丢失

c# - 如何检查字符串中每个字符的数据类型?

c - Linux 和 Solaris 中的 setsockopt 用法 [Solaris 中的参数无效]

c - 如何正确处理套接字接受返回 "Too many open files"

python - 当网络套接字始终准备好读取时如何使用 select?

c# - 在 .NET 4.8 上的 ASP.NET MVC Web 应用程序中安装 Bootstrap 5

c# - Azure 混合连接中的 SYSTEM_USER

c# - Entity Framework 列加密问题

java - VideoView 在通过套接字接收文件时播放文件

android - 带有 Android 服务的 Socket Io