我已经编写了一个Windows服务,使用NModbus库通过TCP执行Modbus WriteMultipleRegisters函数调用到第三方设备,每10分钟执行一次(System.Threading.Timer的滴答声)。
偶尔,在网络故障期间,此连接会挂起打开。由于该设备一次只接受一个Modbus连接,而其他连接被拒绝,因此所有下一个滴答声期间的连接都会失败,并引发SocketException - ConnectionRefused。
但是,设备会自动关闭不响应的连接,时间很短。某些东西必须保持连接在我的一侧,甚至保持两天。更重要的是,当我的服务重新启动时,一切都恢复正常。因此,明确存在一些遗忘的开放连接。但是我无法在开发中重现此错误,所以我不知道/何时……连接会挂起。我只知道下一个连接会被拒绝。
我使用以下代码部分进行modbus函数调用:
偶尔,在网络故障期间,此连接会挂起打开。由于该设备一次只接受一个Modbus连接,而其他连接被拒绝,因此所有下一个滴答声期间的连接都会失败,并引发SocketException - ConnectionRefused。
但是,设备会自动关闭不响应的连接,时间很短。某些东西必须保持连接在我的一侧,甚至保持两天。更重要的是,当我的服务重新启动时,一切都恢复正常。因此,明确存在一些遗忘的开放连接。但是我无法在开发中重现此错误,所以我不知道/何时……连接会挂起。我只知道下一个连接会被拒绝。
我使用以下代码部分进行modbus函数调用:
using (TcpClient client = new TcpClient(device.ip, 502))
{
using (Modbus.Device.ModbusIpMaster master = Modbus.Device.ModbusIpMaster.CreateIp(client))
{
master.WriteMultipleRegisters(500, new ushort[] { 0xFF80 });
}
}
device.ip是包含设备IP地址的字符串 - 这是正确的,通过SocketException细节进行了确认。
由于我使用了using语句,因此两个对象都调用了dispose方法。我已经查看了NModbus源代码,一切都被正确地处理了。
你有任何想法吗?为什么使用这段代码连接没有关闭?
.Dispose
应该关闭连接吗?我在另一个网络库中遇到了这个问题。它可能只是清理资源而没有真正地 "关闭" 任何东西。 - nemec