相关文章推荐
具体情况是我用C#中Socket类ReceiveFrom函数读外界发过来的数据时,读到最后一行数据后,缓冲区已经没有数据了,再用这个函数去读时程序就会卡死(没办法提前判断... 具体情况是我用C#中Socket类ReceiveFrom函数读外界发过来的数据时,读到最后一行数据后,缓冲区已经没有数据了,再用这个函数去读时程序就会卡死(没办法提前判断缓冲区为空)?
比如我的电脑与下位机UDP通信,电脑上发送一条指令到下位机,下位机接收后会返回5条信息过来(每条信息都是以\r\n结尾),电脑上用ReceiveFrom函数可以正确读出这5条信息,但如果读完5条再用这个函数去读的话,程序就卡死,请问有什么办法可以解决这个问题,因为下位机每次发送的数据都可能不固定(有时候5条有时候很多条),所以不可能直接设定ReceiveFrom函数读的次数,怎么样能够判断缓冲区中的数据已经读完了呢?如何能够知道缓冲区中已经读完了,那我就不会再去执行那个函数了,这样是不是就可以解决问题了呢?

receiveFrom 方法 读取数据的时候 如果缓冲区不够大 则会分好几次读取。

通过判断socket.Available  来判断上次读取的数据还有多少未读取。如果Available ==0则本次读取完毕


可以将接收方法封装在一个类中(SocketClient),实例化类后在单个线程中运行。

  int recv;
  byte[] data;
 string receiveStr="";
 while (true)
      {
          //如果发送的字节已经完毕。则重置接收字符串,休眠线程重新等待数据
        if (mySocket.Available == 0)
        {
           //重置前首先尝试写个事件或委托将这次接收的receiveStr传递出去
        OnDataReceived(receiveStr);//这个事件可以自己去补充
        
          receiveStr="";
          System.Threading.Thread.Sleep(1);
          continue;
        }
        int bufferSize =1024;
        data = new byte[1024];
//接收数据到
        int recv = mySocket.ReceiveFrom((data,ref Remote));//Remote 为EndPoint对象 
        将该批次数据保存在receiveStr中
        receiveStr+=Encoding.ASCII.GetString(data,0,recv);
      }
    }
    
    
    //接收的类中 实例化上面的类并订阅
    SocketClient xxx=new SocketClient();
    //订阅接收事件
    xxx.OnDataReceived+=new Hander(this.DataReceived);
    void DataReceived(string receive)
    {
       Console.WriteLine("接收到了收据:"+receive)
    }
 
推荐文章