private const int iBufferSize=1048576;
static public byte[] receiveMessage = new byte[iBufferSize]; ......MemoryStream m = new MemoryStream(receiveMessage);   <==  这条语句第N次执行时出现异常说什么不能读取流结尾之外的数据一开始还行的,当执行几次之后就会有问题请大侠指点

解决方案 »

  1.   

    读操作试图超出流的末尾时引发的异常。 很明显嘛,就是你处理流和结尾,而此时,你还去读取下一个位置的数据,就报错了。 出现的原因可能是:
     
        1、你后面的代码将由于某种当前流的位置移动了。 你检查一下。
       
           你在读取之前,最好增加检查流位置的代码,而不是直接读取。
           可以使用Position 检查流的位置    2、你创建流对像的字节数组是0长度的。         从你的代码来看,应该不是这方面的问题。
      

  2.   

    1、你后面的代码将由于某种原因将当前流的位置移动了。 你检查一下。
       
           你在读取之前,最好增加检查流位置的代码,而不是直接读取。
           可以使用Position 检查流的位置    2、你创建流对像的字节数组是0长度的。         从你的代码来看,应该不是这方面的问题。你最好是将代码贴出来。
      

  3.   

    问题出在这儿
    static public byte[] receiveMessage = new byte[iBufferSize]; 你所有操作都针对一个字节数足receiveMessage操作,而你传给MemoryStream也是receiveMessage,
    MemoryStream内部也用到了receiveMessage,
    因此,问题在于:
    你是否确保你针对receiveMessage的操作和MemoryStream针对receiveMessage是否同步了!!!
      

  4.   

    //全局变量
    private const int iBufferSize=1048576;
    static public byte[] receiveMessage = new byte[iBufferSize]; //定时触发,用来检测是否有数据到来,如果有,则处理掉
    private void timer2_Tick(object sender, System.EventArgs e)
    {
    if(bIsConnected==false)return;
    int iLength = 0, size, offset;
    //System.Threading.Thread.Sleep(300); //to make sure all the data needed by this command is received
    while(true)
    {
    SelectList.Add(comSock);
    Socket.Select(SelectList,null,null,10);
    if(SelectList.Count != 0)
    {
    offset=Convert.ToInt32(RemainData);
    size=Convert.ToInt32(iBufferSize-RemainData);
    //接收数据,并放到receiveMessage的末尾
    iLength = comSock.Receive(receiveMessage,offset,size,0); RemainData += iLength;
    offset += iLength;
    }
    else
    {
    break;
    }
    }
    if(true)
    {
    int Mark;
    if(RemainData<=0) return;
    MemoryStream m = new MemoryStream(receiveMessage); // <===这放语句有问题
    BinaryReader r = new BinaryReader(m);

    Mark = r.ReadInt32();
    switch(Mark)
    {
    case EXIT: break;
    case SET_VIEW_POSITION:
    {
    double X,Y,Z;
    X=r.ReadSingle();
    Y=r.ReadSingle();
    Z=r.ReadSingle();
    SetPosition(X,Y);
    }
    break;
    case TRAVER_PREDEF:
    break;

    default: break; }
    //RemainData=lens-m.Position;
    RemainData -= m.Position;
    for(int i=0;i<RemainData;i++)
    {
    receiveMessage[i]=receiveMessage[i+m.Position];
    }
    r.Close();
    m.Close();
    }
    SelectList.Clear();
    }
    }
      

  5.   

    //这条语句是把后面还没用掉的数据移到receiveMessage的开始
    for(int i=0;i<RemainData;i++)
    { {
    receiveMessage[i]=receiveMessage[i+m.Position];
    }
      

  6.   

    MemoryStream m = new MemoryStream(receiveMessage);
    m.Position = 0;读取流的指针到了结尾,所以不能向下读取了。