问题描述
在做上位机与下位机通讯的时候(其中上位机端为客户端,下位机端为服务器端),当出现上位机与下位机通讯断线重连的时候,会偶尔(并不是每次都会出现)出现这个问题:远程主机强迫关闭了一个现有的连接。查了下问题应该是出在红色的那一块,这个该怎么解决?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的回复:
当上位机和下位机断线时,在重新进行连接的时候出现的问题这表示断线后服务方并未主动关闭连接,导致再次连接失败显然是你的程序容错能力太差了
服务器端的程序不是我写的........那我这边客户端的程序应该怎么处理这种情况?