C# modbus tcp协议在运行时出现远程主机强迫关闭了一个现有的连接

问题描述

在做上位机与下位机通讯的时候(其中上位机端为客户端,下位机端为服务器端),当出现上位机与下位机通讯断线重连的时候,会偶尔(并不是每次都会出现)出现这个问题:远程主机强迫关闭了一个现有的连接。查了下问题应该是出在红色的那一块,这个该怎么解决?internalclassModbus_SocketWrapper:IDisposable{privatestaticintPort=Int32.Parse(ConfigurationManager.AppSettings["Port"]);//数据传输的端口号Port,ModbusTCP规定为502privatestaticintTimeout=Int32.Parse(ConfigurationManager.AppSettings["SocketTimeout"]);//设置数据发送超时时间publicModbus_ILogLogger{get;set;}publicSocketsocket=null;#region建立Socket连接///<summary>///创建一个基于TCP上的Socket///实现Socket端口复用///将服务器主机的IP地址与端口号组合///建立与远程主机的连接///</summary>publicvoidConnect(stringIp){this.socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);this.socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,Timeout);IPEndPointip=newIPEndPoint(IPAddress.Parse(Ip),Port);this.socket.Connect(ip);}#endregion#region读取数据publicbyte[]Read(intlength){byte[]data=newbyte[length];try{this.socket.Receive(data);this.Log("Receive:",data);returndata;}catch(Exceptionex){socket.Close();returnnull;}}#endregion#region写入数据publicvoidWrite(byte[]data){this.Log("Send:",data);this.socket.Send(data);}#endregion#region记录数据(此版本没用)publicvoidLog(stringtype,byte[]data){if(this.Logger!=null){//创建一个新的可变字符字符串对象StringBuilderlogText=newStringBuilder(type);//将数据中的每一个byte量foreach(byteitemindata){//将括号内的item转化成字符串表示形式添加到当前对象表示的字符串结尾处logText.Append(item.ToString()+"");}this.Logger.Write(logText.ToString());}}#endregion#regionIDisponsable成员publicvoidDispose(){if(this.socket!=null){this.socket.Close();}}#endregion}

解决方案

解决方案二:
就说明MODBUS人家服务出问题了呗,正在重新启动。。。
解决方案三:
引用1楼wyd1520的回复:

就说明MODBUS人家服务出问题了呗,正在重新启动。。。

可是我的上位机通讯程序关闭后重新启动就好了,这个是怎么回事?
解决方案四:
"远程主机强迫关闭了一个现有的连接"这一般说明了你的客户端做坏事了,比如少传了数据,不按规矩传数据,等等。通信是要严格遵守协议的,好的服务器端如果侦测到异常数据,最常见,也是最有效的处理方式就是断开连接。
解决方案五:
引用3楼Forty2的回复:

"远程主机强迫关闭了一个现有的连接"这一般说明了你的客户端做坏事了,比如少传了数据,不按规矩传数据,等等。通信是要严格遵守协议的,好的服务器端如果侦测到异常数据,最常见,也是最有效的处理方式就是断开连接。

如果没有出现上位机和下位机断线的情况,这个问题就不会出现。这个问题是当上位机和下位机断线时,在重新进行连接的时候出现的问题,可能会出在哪?
解决方案六:
代码写的不行呗。。。Socket你控制的不好
解决方案七:
引用5楼wyd1520的回复:

代码写的不行呗。。。Socket你控制的不好

大神,求帮助~
解决方案八:
光求助有啥用。。。没时间搞这个。我们用ModBus只用COM口方式
解决方案九:
引用7楼wyd1520的回复:

光求助有啥用。。。没时间搞这个。我们用ModBus只用COM口方式

好吧,继续找找问题在哪
解决方案十:
当上位机和下位机断线时,在重新进行连接的时候出现的问题这表示断线后服务方并未主动关闭连接,导致再次连接失败显然是你的程序容错能力太差了
解决方案十一:
引用9楼xuzuning的回复:

当上位机和下位机断线时,在重新进行连接的时候出现的问题这表示断线后服务方并未主动关闭连接,导致再次连接失败显然是你的程序容错能力太差了

服务器端的程序不是我写的........那我这边客户端的程序应该怎么处理这种情况?

时间: 2025-01-01 16:26:55

C# modbus tcp协议在运行时出现远程主机强迫关闭了一个现有的连接的相关文章

一个网络程序,在局域网调试没有问题,把服务器端移到英特网(外网)上,运行客户端时出现&amp;amp;quot;远程主机强迫关闭了一个现有的连接&amp;amp;quot;错误!请高手进,在线等

问题描述 服务器端代码:classThreadtcp{privateSocketserver;publicThreadtcp(){IPAddresslocal=Dns.GetHostAddresses(Dns.GetHostName())[0];IPEndPointiep=newIPEndPoint(local,30000);server=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);server

用eclipse集成环境运行android程序控制台提示远程主机强迫关闭了一个现有的连接

问题描述 用eclipse集成环境运行android程序控制台提示远程主机强迫关闭了一个现有的连接 用eclipse集成环境运行android程序,在DDMS控制台提示如下: [2016-02-27 19:30:07 - DeviceMonitor] Adb connection Error:远程主机强迫关闭了一个现有的连接. [2016-02-27 19:30:10 - DeviceMonitor] Connection attempts: 1 求大神解答 解决方案 参考下:http://bl

为什么.net的程序本身执行,运行没任何问题,但部署到IIS中的时候报“远程主机强迫关闭了一个现有的连接。 ”,未开启防火墙。

问题描述 为什么.net的程序本身执行,运行没任何问题,但部署到IIS中的时候报"远程主机强迫关闭了一个现有的连接.",未开启防火墙. 解决方案 解决方案二:很明显,程序和数据连接出了问题解决方案三:远程主机强迫关闭了一个现有的连接.未开启防火墙.1.IIS设置最大连接池,有可能链接的过多,SqlConnection后要Dispose2.trycatch具体看看报出的异常是什么解决方案四:问题是本地运行没任何问题,只是部署到IIS会出现问题解决方案五:权限,路径是否正确.

局域网-C# 用modbus tcp协议,怎么做一个上未将与多个下位机通讯

问题描述 C# 用modbus tcp协议,怎么做一个上未将与多个下位机通讯 C# 用modbus tcp协议,怎么做一个上未将与多个下位机通讯,是要建立局域网吗,要怎么建立,连接?求大虾帮帮忙! C#上位机的.. 解决方案 将上位机与下位机全都连上局域网,并获取ModbusTCP的端口号(默认502),在上位机上用Socket打开下位机的TCP连接,按照ModbusTCP规范轮询下位机.如果下位机直接接入局域网,那一个下位机就需要一个TCP连接.如果通过网关接入,就需要查看网关的使用文档. 解

使用C#通过modbus TCP协议实现对可编程马达控制器的控制

问题描述 各位大神,我现在在用WPF/C#做一个客户端的界面,实现通过modbustcp的协议对我的马达控制器的控制,但是好像并没有找到合适的modbustcp的动态链接库.我利用的modbus_vc.dll可以连接上设备,但是发送十进制的指令并没有回应.十进制的指令应该是没有问题的,我用modbus的第三方软件测试过的.我不知道是我的dll动态链接库有问题,还是我的指令发送有错误.以下是我的C#程序.请问我错在哪个环节了,请问有大牛可以给我指点一下这个dll动态链接库里的函数的参数都是什么意思

Flink运行时之合久必分的特定任务

合久必分的特定任务 前面我们谈到了TaskManager对每个Task实例会启动一个独立的线程来执行.在分析线程执行的核心代码时,我们看到最终执行的是AbstractInvokable这样执行体的invoke方法.所谓合久必分,鉴于流处理任务跟批处理任务执行模式上存在巨大的差异,在对AbstractInvokable的实现时,它们将会走向两个不同的分支. 流处理相关的任务 流处理所对应的任务的继承关系图如下: 从上面的继承关系图可见,StreamTask是流处理任务的抽象.因为在DataStre

二维码-Android 导入library 运行时提示NotFoundClass

问题描述 Android 导入library 运行时提示NotFoundClass 用eclipseADT 写一个简单的APP,其中包括二维码扫码 需要用到 ImageIO 等外部类,于是导入了JRE1.6 library ,一切正常 也可以正常import javax.imageio.ImageIO;等 然而真机运行时却一直提示ClassNotFoundException 上网查过一番之后,楼主在build path 里的Order and Export勾选上了该library,但问题依旧--

AssetHook:Android应用资源数据运行时编辑工具

本文讲的是AssetHook:Android应用资源数据运行时编辑工具,AssetHook是一个工具,它可以让Android安全研究人员和普通用户能够在无需修改APK本身的情况下随时修改Android应用程序的部分Asset.这样的修改使研究人员可以改变嵌入式数据,以更好地评估和测试移动应用程序.目前来看AssetHook比现有方法更容易使用,且比传统方法更有效. 背景 去年年底,我开始关注Android启用React Native 后 Facebook的新框架,它将跨平台移动开发统一到Java

设计-在运行时如何获取数值?

问题描述 在运行时如何获取数值? 设计一个名为Location的类,定位二维数组中的最大值及其位置.这个类包括公共的数据域row.column和maxValue,二位数组中的最大值及其下标用int型的row和column以及double型的maxValue存储. 编写下面的方法,返回一个二位数组中最大值的位置. public static Location locateLargest(double[][] a) 返回值是一个Location的实例.