UDP客户端-创建套接字异常每个套接字地址(协议/网络地址/端口)通常只允许使用一次

本文关键字:套接字 许使用 一次 客户端 端口 异常 地址 网络地址 UDP 协议 创建 | 更新日期: 2023-09-27 18:03:44

我正在创建一个UDP客户端在我的c#应用程序。

labelEP = new System.Net.IPEndPoint(tempAdd, ethPortAddress);
recvMIUCmndsSocket = new UdpClient(labelEP);
Socket temp = recvMIUCmndsSocket.Client;
 //Allow broadcasts
temp.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

每当我启动我的应用程序,它工作正常。如果我的应用程序有任何问题,应用程序会自动重启。有时当应用程序重新启动时,我面临的异常:

"Only one usage of each socket address (protocol/network address/port) is normally permitted "

似乎是垃圾收集器没有释放之前的udpclient套接字实例。这种情况会发生吗?

的问候Raju

UDP客户端-创建套接字异常每个套接字地址(协议/网络地址/端口)通常只允许使用一次

垃圾收集器将负责处理托管对象。根据我的基本理解,套接字是本机windows对象,.net为它们提供了托管包装器。还有一次我的架构师告诉我,当我们关闭一个端口或套接字时,窗口需要一些时间来关闭它。

我对c#并不完全熟悉,但我最近一直在用Java做一些类似的工作,我发现了三件事:

首先,您需要关闭连接,即使在出现错误情况后也是如此。它可能会变得有点混乱,因为(至少在Java中),一些自己清理的调用可能会生成异常。

第二,这种显式的关闭连接可以让垃圾收集器更好地完成它的工作。但是,您无法真正控制GC何时运行,因此您无法预期连接将被清理,套接字将立即准备好再次使用。如果您立即尝试重新打开连接,则套接字可能尚未完全准备好。

第三,操作系统经常参与管理网络连接和网络资源。因此,仅仅因为您和您的环境已经释放并清理了资源并不意味着操作系统已经(重新)使其可用。