socket-远程主机强迫关闭了一个现有的连接,求助~

问题描述

远程主机强迫关闭了一个现有的连接,求助~
问题是发生在我的客户端和服务器端之间进行Modbus TCP通讯的时候。代码如下:
    internal class ModbusTcpIpWrapper : ModbusWrapper IDisposable    {        public static ModbusTcpIpWrapper Instance = new ModbusTcpIpWrapper();        private ModbusSocketWrapper socketWrapper = new ModbusSocketWrapper();        public bool Connected = false;        #region modbus tcp连接        public override void Connect(string ip)        {            if (!Connected)            {                this.socketWrapper.Logger = Logger;                this.socketWrapper.Connect(ip);                this.Connected = true;            }        }        #endregion        #region 读取Modbus寄存器数据        public override byte[] Receive(string ip byte functionCode UInt16 startAddress short registerNum int bufferSize)        {            Connect(ip);            List<byte> sendData = new List<byte>(255); //申请一个255个字节空间的List            //发送Modbus请求ADU编码            sendData.AddRange(ModbusValueHelper.Instance.GetBytes(this.NextDataIndex())); //事务ID标识            sendData.AddRange(new Byte[] { 0 0 }); //Protocal Identifier(协议标识),Modbus中此值为0            sendData.AddRange(ModbusValueHelper.Instance.GetBytes((short)6)); //后续的Byte数量(针对读请求,后续为6个byte)            sendData.Add((byte)0); //Unit Identifier(单元标识符):用于系统间的路由            sendData.Add((byte)functionCode); //读取寄存器中的值            sendData.AddRange(ModbusValueHelper.Instance.GetBytes((Int16)startAddress)); //起始地址            sendData.AddRange(ModbusValueHelper.Instance.GetBytes((short)registerNum)); //需要读取寄存器的数量            this.socketWrapper.Write(sendData.ToArray()); //发送读请求            //防止连续读写引起前台的UI线程堵塞            Application.DoEvents();            //读取Response Header:完后会返回8个byte的Response Header            byte[] receiveData = socketWrapper.Read(bufferSize ip); //缓冲区中的数量不超过256byte一次读256byte,防止残余数据影响下次读取            short identifier = (short)((((short)receiveData[0]) << 8) + receiveData[1]);            //读取返回数据:根据Response Header读取后续的数据            if (identifier != CurrentDataIndex) //请求的数据标识与返回的标识不一致,则丢掉数据包            {                return new Byte[0];            }            byte length = receiveData[8]; //最后一个字节,记录寄存器中数据的Byte数            byte[] result = new byte[length];            Array.Copy(receiveData 9 result 0 length); //从指定的索引源开始,复制receiveData中的一系列数据到result中(从指定目标的索引开始)            return result;        }        #endregion
     internal class ModbusSocketWrapper : IDisposable    {        private static int Port = Int32.Parse(ConfigurationManager.AppSettings[""Port""]); //数据传输的端口号PortModbus TCP规定为502        private static int Timeout = Int32.Parse(ConfigurationManager.AppSettings[""SocketTimeout""]); //设置数据发送超时时间        public IModbusLog Logger { get; set; }        public Socket Socket = null;        #region 建立Socket连接        /// <summary>        /// 创建一个基于TCP上的Socket        /// 实现Socket端口复用        /// 将服务器主机的IP地址与端口号组合        /// 建立与远程主机的连接        /// </summary>        public void Connect(string ip)        {            this.Socket = new Socket(AddressFamily.InterNetwork SocketType.Stream ProtocolType.Tcp);            this.Socket.SetSocketOption(SocketOptionLevel.Socket SocketOptionName.SendTimeout Timeout);            IPEndPoint ipConnect = new IPEndPoint(IPAddress.Parse(ip) Port);            this.Socket.Connect(ipConnect);        }        #endregion        #region 读取数据        public byte[] Read(int length string ipGet)        {            byte[] data = new byte[length];            //while (true)            //{                try                {                    Socket.Receive(data);                    Log(""Receive:"" data);                    return data;                }                catch (Exception ex)                {                    string ep = ex.ToString();                    Socket.Close();                    Connect(ipGet);                    //MessageBox.Show(ep);                    return null;                }            //}        }        #endregion        #region 写入数据        public void Write(byte[] data)        {            try            {                Log(""Send:"" data);                Socket.Send(data);            }            catch (Exception ex)            {                string ep = ex.ToString();                //MessageBox.Show(ep);            }        }        #endregion        #region 记录数据        public void Log(string type byte[] data)        {            if (Logger != null)            {                //创建一个新的可变字符字符串对象                StringBuilder logText = new StringBuilder(type);                //将数据中的每一个byte量                foreach (byte item in data)                {                    //将括号内的item转化成字符串表示形式添加到当前对象表示的字符串结尾处                    logText.Append(item.ToString() + """");                }                Logger.Write(logText.ToString());            }        }        #endregion        #region IDisponsable 成员        public void Dispose()        {            if (Socket != null)            {                Socket.Close();            }        }        #endregion    }
 当我运行时,就会出现下面的问题



我将我发送的请求和Modbuspull这个工具发送的请求进行了对比,是一样的,但是我的请求会被拒绝,而Modbuspull这个工具发送的请求能正常收到请求后服务器返回的数据,请问这个原因是什么?

解决方案

真机调试,远程主机强迫关闭了一个现有的连接
Adb connection Error:远程主机强迫关闭了一个现有的连接
Adb connection Error:远程主机强迫关闭了一个现有的连接。

时间: 2024-12-23 22:31:54

socket-远程主机强迫关闭了一个现有的连接,求助~的相关文章

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

问题描述 在做上位机与下位机通讯的时候(其中上位机端为客户端,下位机端为服务器端),当出现上位机与下位机通讯断线重连的时候,会偶尔(并不是每次都会出现)出现这个问题:远程主机强迫关闭了一个现有的连接.查了下问题应该是出在红色的那一块,这个该怎么解决?internalclassModbus_SocketWrapper:IDisposable{privatestaticintPort=Int32.Parse(ConfigurationManager.AppSettings["Port"])

Netty学习4—NIO服务端报错:远程主机强迫关闭了一个现有的连接

1 发现问题 NIO编程中服务端会出现报错 Exception in thread "main" java.io.IOException: 远程主机强迫关闭了一个现有的连接. at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25) at sun.nio.ch.IOUtil.readIntoNativeBuffer(I

一个网络程序,在局域网调试没有问题,把服务器端移到英特网(外网)上,运行客户端时出现&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

Adb connection Error:远程主机强迫关闭了一个现有的连接

做android开发的时候eclipse的console一直出现这个问题,有时候是启动eclipse后就出现这个问题,有时候是运行android程序的时候出现的,重启avd和重启eclipse都不行.后面在网上找到了解决办法. 先说原因嘛,这是ddms调用adb引发的. 经过一番搜索, 发现这是windows环境下, adb的一个限制, 也可以说是bug.  当手机上同时运行的进程数大于64时, 就会引发adb奔溃. 更深层次的原因, 就是windows API的WaitForMultipleO

adb-Adb connection Error:远程主机强迫关闭了一个现有的连接。

问题描述 Adb connection Error:远程主机强迫关闭了一个现有的连接. andriod 启动虚拟机的时候报以下错误 [2015-01-25 16:10:29 - DeviceMonitor] Adb connection Error:远程主机强迫关闭了一个现有的连接. [2015-01-25 16:10:30 - DeviceMonitor] Connection attempts: 1 [2015-01-25 16:10:32 - DeviceMonitor] Connecti

真机调试遇到麻烦:远程主机强迫关闭了一个现有的连接

问题描述 真机调试遇到麻烦:远程主机强迫关闭了一个现有的连接 使用豌豆荚,USB线连接手机,Eclipse中运行Android应用程序时, 总是提示:远程主机强迫关闭了一个现有的连接. 在网上下了几个adb.exe文件放到SDK/platform-tools下,还是不行 请问各位高手,怎么彻底解决这个问题, 我用的API-18 Android4.3 ADT:v22.2.1-833290 解决方案 看下你的真机是不是安装了杀毒软件或者什么软件干扰了你的程序 解决方案二: 手机上有策略不允许你链接访

在svn上update的时候提示 远程主机强迫关闭连接远程主机强迫关闭了一个现有的连接

问题描述 在svn上update的时候提示 远程主机强迫关闭连接远程主机强迫关闭了一个现有的连接 提示如下,在网上没找到可靠的办法,重启.svn修复都试过了,但还是这样. 请高手执照 解决方案 SVN 远程主机强迫关闭了一个现有的连接远程主机强迫关闭了一个现有的连接.UDP 远程主机强迫关闭了一个现有的连接 解决方案二: 是不是你的账号没有提交权限. 解决方案三: 用svn清除一下就可以了 解决方案四: 机器人给出的第一个链接楼主试试. 解决方案五: 以上方法都没有用吗,还是这样

紧急求助:RC: 10054 远程主机强迫关闭了一个现有的连接

问题描述 项目上线,但是报出下列错误,请高手解答下,不胜感激:[11-12-515:07:41:593CST]00000017srtEcom.ibm.ws.webcontainer.srt.SRTServletRequestparseParametersSRVE0133E:解析参数时出错.{0}java.io.IOException:AsyncIOoperationfailed(1),reason:RC:10054远程主机强迫关闭了一个现有的连接.atcom.ibm.io.async.Async

用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

求解决Webservice 接口调用远程主机强迫关闭了一个现有的连接异常

问题描述 HttpWebRequestrequest=HttpWebRequest.Create(url+"?WSDL")asHttpWebRequest;HttpWebResponseresponse=request.GetResponse()asHttpWebResponse;//这一句异常if(response.StatusCode!=HttpStatusCode.OK)returnfalse;url为一个Webservice接口连接,程序调用也不是每个调用都不成功,我在多个客户