Binaryreader Readint32返回的值太大或-ve值

问题描述

我正在处理客户端服务器应用程序,其中服务器使用UDT协议将屏幕图像发送到客户端。下面是我的代码服务器使用二进制写入器发送图像,而客户端使用二进制写入器接收数据。代码可以完美地进行几次迭代,但是经过几次迭代后reader.ReadInt32()读取的数字太大或为负数。我已经阅读了大多数与二进制阅读器相关的问题,但没有发现任何帮助。

服务器代码

public void SendImage(Bitmap bmp)
{
   BinaryWriter writer = new BinaryWriter(CStream);
       
   using (MemoryStream ms=new MemoryStream())
   {
       bmp.Save(ms,ImageFormat.Jpeg);//save to memory stream 

       long fileSize = ms.Length;
       writer.Write(fileSize); //send length
         
       byte[] buffer = new byte[512 * 1024];
       long pos = 0;
       ms.Seek(0,SeekOrigin.Begin);

       while (pos < fileSize)
       {
            //If buffer size is smaller then filesize then send in parts
            Int32 toSend = buffer.Length < (fileSize - pos)? buffer.Length: (Int32)(fileSize - pos);
            ms.Read(buffer,toSend); //read from memory stream to byte array
            writer.Write(toSend); 
            ServerSocket.Send(buffer,toSend);
            pos += toSend;

             Console.WriteLine(itration + ",fileSize : "+ fileSize + "," + toSend + ",[buffer]: " + buffer[toSend - 3] + "," + buffer[toSend - 2] + "," + buffer[toSend-1]);
               
       }
       itration++;
           
       ms.Flush();
       ms.Close();
          }
}

客户端代码

private void startRead()
{
  while (true)
  {
    Bitmap inImage = ReceiveImage(Settings.Encrypted);//BitmapFromStream(Settings.Encrypted);
    theImage.Image = (Image)inImage;
  }
}
private Bitmap ReceiveImage(bool Encrypted)
{
            Bitmap img = null;
            byte[] buffer;
            BinaryReader reader = new BinaryReader(CStream);
            using(MemoryStream ms=new MemoryStream())
            {
                try
                {
                    long size = reader.ReadInt64();//read file length first

                    buffer = new byte[4 * 1024 * 1024];

                    long read = 0;

                    while (read < size)
                    {
                        int toRecv = reader.ReadInt32(); //here reader reads wrong value

                        Console.WriteLine(itration + "filesize " + size + " Byte to read : " + toRecv);

                        ReadFragment(reader,toRecv,buffer);

                        ms.Write(buffer,toRecv);

                        read += toRecv;
                    }
                    itration++;
                    ms.Position = 0;
                    img = new Bitmap(ms);
                }
                catch (Exception Ex)
                {
                    Console.WriteLine(Ex.Message + " : " + Ex.StackTrace);
                }
                buffer = null;
                ms.Flush();
                ms.Close();
            }
            reader = null;
            return img;
}
private int ReadFragment(BinaryReader reader,int size,byte[] buffer)
{
       int read = 0;
       while (read < size)
       {
           read += reader.Read(buffer,read,size - read);
       }
    return read;
}

这是服务器的控制台输出

0,fileSize : 568633,524288,[buffer]: 0,162,138
0,44345,[buffer]: 31,255,217
1,fileSize : 568468,[buffer]: 2,138,40
1,44180,[buffer]: 3,217
2,fileSize : 578806,[buffer]: 198,177,106
2,54518,[buffer]: 1,217
3,fileSize : 589967,[buffer]: 20,81,64
3,65679,[buffer]: 15,217

11,fileSize : 632653,[buffer]: 243,0
11,108365,217
12,fileSize : 642562,[buffer]: 205,20,85
12,118274,[buffer]: 7,217
13,fileSize : 645552,[buffer]: 236,49,131
13,121264,217

和客户端的colsole输出

0  filesize 568633 Byte to read : 524288
0  filesize 568633 Byte to read : 44345
1  filesize 568468 Byte to read : 524288
1  filesize 568468 Byte to read : 44180
2  filesize 578806 Byte to read : 524288
2  filesize 578806 Byte to read : 54518
3  filesize 589967 Byte to read : 524288
3  filesize 589967 Byte to read : 65679

11  filesize 632653 Byte to read : 524288
11  filesize 632653 Byte to read : 108365
12  filesize 642562 Byte to read : 524288
12  filesize 642562 Byte to read : 118274
13  filesize 645552 Byte to read : 524288
13  filesize 645552 Byte to read : 671776930 <-- here it read either too big number or negative number
Exception thrown: 'System.ArgumentException' in mscorlib.dll

我已经尝试使用binaryformater,protobuf而不是binaryreader,但是经过几次迭代后它仍然停止。帮助我找到原因。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)