我使用 UDP 套接字在 C#(.NET Compact Framework 2.0)中编写了一个非常基本的应用程序。
该程序可以正常运行一段时间(一次最多几个星期),但最终总是失败。除了我的客户端无法重新连接之外,这个错误似乎会不利地杀死相关 NIC 的所有活动。一旦发生这种情况,我将无法再远程访问设备(使用 CE Remote Display)——这是我获得额外调试反馈的唯一方法。所以在这一点上,我不能 100% 确定应用程序本身是否崩溃,或者我是否通过套接字代码破坏了操作系统中的某些内容。
我已经实现了一个从未被引发的未处理的异常事件。我还有一些 try/catch 块,可以将异常消息输出到文本文件。我没有看到抛出任何异常。
/// 删除了旧的 TCP 代码。
客户端本身是简单的小型网关设备,配置为 UDP 服务器。这是一个我很少访问的远程系统,虽然我有一个测试控制器和网关单元,但条件并不相同,我还没有能够在我的最后重现这个问题。
TIA 获取任何反馈。
编辑:
我一直在运行我的测试台演示,并根据一些评论建议定期检查服务器上的 netstat。在 CE5 netstat 中不带 -a 标志,所以我一直在使用 -n (不确定这是否会告诉我我需要什么......)。我已经多次断开和重新连接我的客户端,通过拔下以太网等强制半开,并且 netstat 表只显示每个客户端的一个连接(在适当的端口)。
编辑2:
由于生产过程中消息传递的稀疏性,我将应用程序更改为无连接 UDP 消息传递,但我仍然遇到相同的行为(失败的时间大致相同)。在我的测试硬件上,应用程序以高消息率(每隔几秒一次)无限期地成功运行。但是,在消息不那么频繁的生产环境中,程序在运行大约 10 天后就会失败。我不认为不活动会很重要,但也许我错了?寻找我能得到的任何建议。
新的发送/接收代码:
public void Send(string Message)
{
Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = new IPEndPoint(IPAddress.Parse(_ipAddress), _port);
udpClient.Connect(ep);
byte[] data = Encoding.ASCII.GetBytes(Message);
// async send, sync receive
udpClient.BeginSendTo(data, 0, data.Length, SocketFlags.None, …Run Code Online (Sandbox Code Playgroud)