c#Socket遇到Receive阻断线程问题处理

最近写一个上位机遇到套接字读取数据的时候线程停止。
上读取代码:

        public static bool ReadAirCompressor(string address,  out int Data)
        {
            bool result=false;
            address = DataRead.ReadAddress; //空压机地址
            int  cnt = 43;                       //读取数据个数
            result = ComCompressor(address, 0x01,0x10, cnt);
            if (result == true)
            {
                Data = 1;
                return true;
            }
            else
            {
                Data = 0;
                return false;
            }
        }
        public static bool ComCompressor(string ipaddress, int address, int state, int DataCnt )
        {
            byte[] Mdata = new byte[8];
            dataCnt = DataCnt;//先声明读数据长度
            DateTime sendtime = DateTime.Now;
           // SendData =Convert.ToString( sendtime)+">>"+ipaddress+address+dataCnt; //发送到显示

            Mdata[0] = Convert.ToByte(address);     //modbus站号
            Mdata[1] = 0x03;                        //功能码 写多个寄存器
            Mdata[2] = 0x00;
            Mdata[3] = 0x30;
            //Mdata[2] = Convert.ToByte(state >> 8);  //起始地址高位
            //Mdata[3] = Convert.ToByte(state & 0xFF);//起始地址地位
            Mdata[4] = 0x00;                        //寄存器总数高位
            Mdata[5] = 0x02;                        //寄存器总数低位 2
            Mdata[6] = 0xC4;                        //CRC校验高
            Mdata[7] = 0x04;                        //CRC校验低


            //连接套接字
            Socket sokClient = null;//负责与服务端通信的套接字
            sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建 ip对象

            IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.0.110"),8001);
            //连接 服务端监听套接字
            sokClient.Connect(endpoint);
            sokClient.Send(Mdata);
            byte[] msgArr = new byte[9 * 1];//接收到的消息的缓冲区
            int length = 0;
            //接收服务端发送来的消息数据 thread
            Thread.Sleep(100);
            SendData = "";
            if(sokClient.Available>0)
            {
                length = sokClient.Receive(msgArr);//Receive这里阻断线程
            }
            else
            {
                sokClient.Close();
            }
           
           int[] d = new int[msgArr.Length];
            string[] hex=new string[msgArr.Length];
            for (int i=0;i<msgArr.Length;i++)
            {
                d[i] = Convert.ToInt32(msgArr[i]);
                hex[i] = d[i].ToString("X2");
            }

            return false;
        }

如上代码,无缘无故线程停止。
查问题,逐句运行。发现是读取数据的时候出错。
所以增加一个判断,在有消息的时候进行读取。
但是发现一直收不到消息。
检测发现报文发送错误
修改正确的报文后bug解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我这人很简单

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值