bst*_*582 5 c# sockets udp compact-framework windows-ce
我使用 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, ep, (ar) =>
{
try
{
udpClient.EndSendTo(ar);
_lastSent = Message;
string msg = this.ReceiveSync(udpClient, 3);
if (!string.IsNullOrEmpty(msg))
{
_lastReceived = msg;
DataReceived(new ReceiveDataEvent(_lastReceived));
}
}
catch { }
finally
{
udpClient.Close();
}
}, null);
}
private string ReceiveSync(Socket UdpClient, int TimeoutSec)
{
string msg = "";
byte[] recBuffer = new byte[256];
int elapsed = 0;
bool terminate = false;
do
{
// check for data avail every 500ms until TimeoutSecs elapsed
if (UdpClient.Available > 0)
{
int bytesRead = UdpClient.Receive(recBuffer, 0, recBuffer.Length, SocketFlags.None);
msg = Encoding.ASCII.GetString(recBuffer, 0, recBuffer.Length);
terminate = true;
}
else
{
if ((elapsed / 2) == TimeoutSec)
terminate = true;
else
{
elapsed++;
System.Threading.Thread.Sleep(500);
}
}
} while (!terminate);
return msg;
}
Run Code Online (Sandbox Code Playgroud)
您可能用完了服务器上的套接字(Windows CE 5,32 位操作系统)。请参阅类似内容:Linux 上计算机之间的 tcp/ip 连接数量是否有限制?。“...一旦 TCP 套接字关闭(默认情况下),端口将保持占用状态 TIMED_WAIT 状态 2 分钟...”
我缺少有关每次有多少客户端创建/关闭连接的信息。您可能需要考虑套接字选项 SO_REUSEADDR (https://learn.microsoft.com/en-us/previous-versions/windows/embedded/ms884940%28v%3dmsdn.10%29)。
您可以在服务器的子网中进行循环网络跟踪(30 分钟左右,足以有机会查看之前发生的情况,具体取决于“崩溃”后停止跟踪的速度),以查看在发生故障之前发生的情况'碰撞'。
另一个困难是定期重新启动服务器(在晚上),因为所有 Windows Mobile CE 设备都不能 24/7 良好运行。
我们的客户使用大量 Windows Embedded Handheld 6.5(基于 CE5)设备。即使它们没有太多网络,如果每天晚上重新启动,这些设备在白天也能最稳定地工作。定期重新启动还会发现 CE5 服务器上的 NIC 驱动程序有问题(谁知道,有些公司在平台软件方面做得不好)。或者尝试其他供应商的网卡。
顺便说一句:我已经为 Windows Mobile 编写了自己的 netstat:http://www.hjgode.de/wp/2013/09/24/mobile-development-netstat-know-your-devices-open-ports/。我没有在 Windows CE5 上测试它,但它应该可以工作或者也可以在 CE5 上工作。
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |