byte[] allbuf=null
private void ReceiveCallBack(IAsyncResult ar)
{
  allbuf   //2M缓存
  filebuf  //文件字节数组,这时数据已经写如filebuf
  Array.Copy(allbuf);//简化了写发,我只是想表达意思,这里把文件字节复制到2M缓存
  allbuf=new byte[Array.Length]
  if (token[1] == allbuf.Length.ToString() || allbuf.Length == (2048 *1024) || j==bagnum || allbuf.Length > 2096640)
  {
    写如硬盘
  }
  BeginReceive(.......); //接收文件 
}

解决方案 »

  1.   

    这样不行,Array.Copy(allbuf);这里会报错的,因为allbuf不能为空
    我这里的具体写发为         //要被复制的参数,被复制的开始索引,目标,目标索引,复制数目
    Array.Copy(cs.buff, receivebuf.Length, allbuf, i, cs.buff.Length - receivebuf.Length);
    如果在前面allbuf=null,这里复制时就会报错
      

  2.   

    如果有耐心的人可以看下我的接收源码  谢谢,这样具体些
     private void ReceiveCallBack(IAsyncResult ar)
            {
                try
                {
                    Client cs = (Client)ar.AsyncState;
                    int len = ConnSocket.EndReceive(ar);//这个地方的socket有问题,要考虑
                    if (len != 0)
                    {
                        string msg = System.Text.Encoding.Default.GetString(cs.buff,0,len);
                        string[] token = msg.Split('|');
                        string filepath = @"D:\我是接收的文件.exe";
                        if (token[0] == ((int)cmdd.OK).ToString())
                        {
                            FileStream fs = new FileStream(filepath, FileMode.Append, FileAccess.Write);
                            string cmd = token[0] + "|" + token[1] + "|";
                            string strok = token[0] + "|";
                            byte[] receivebuf = System.Text.Encoding.Default.GetBytes(cmd.ToCharArray());
                            //int baglen=receivebuf.Length + 512*1024;//这是一个包的大小,这里暂时不需要
                            //发送的时候2M的缓冲区只剩下不到512K的容量了,这时我下面是不会写入数据的,但是又发来一个数据包,缓冲区溢出(再写入地方已经解决此问题)
                            //2048*1024/cs.buff.Length
                            Array.Copy(cs.buff, receivebuf.Length, allbuf, i, cs.buff.Length - receivebuf.Length);
                            allbuf = new byte[allbuf.Length];
                            i += cs.buff.Length - receivebuf.Length;
                            bagnum = Convert.ToInt32(token[1]) / (512*1024);//这个地方应该是 (文件+命令*包数)/(命令+512*1024),但是经过数学公式成此代码
                            if (Convert.ToInt32(token[1]) % (512*1024) != 0)
                            {
                                bagnum += 1;
                            }
                            // 当一个文件小与或等于2M时 || 当接收缓冲区allbuf满时 || 当最后一个包发送过来时 || 发送的时候2M的缓冲区只剩下不到512K的容量了,这时是不会写入数据的,但是又发来一个数据包,缓冲区溢出
                            if (token[1] == allbuf.Length.ToString() || allbuf.Length == (2048 * 1024) || j==bagnum || allbuf.Length > 2096640)
                            {                            receivefileDone.Reset();
                                fs.BeginWrite(allbuf,0, allbuf.Length, new AsyncCallback(writefileCallback), fs);
                                receivefileDone.WaitOne();
                                j++;
                                i = 0;
                            }
                            //fs.BeginWrite(cs.buff, receivebuf.Length, len - receivebuf.Length, new AsyncCallback(writefileCallback), fs);
                            if (Convert.ToInt32(token[1]) != fs.Length)//当传过来的文件长度不等于我硬盘文件长度就是没传完,发送OK让服务器继续传
                            {
                                SendToUpServer(cs.ClientSocket, strok);
                            }
                            fs.Flush();
                            int cc=cs.buff.Length;
                            fs.Close();
                        }
                        else if (token[0] == ((int)cmdd.ERR).ToString())
                        {
                            cs.ClientSocket.Close();
                        }
                    }
                    cs.ClientSocket.BeginReceive(cs.buff, 0, cs.buff.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), cs);
                }
                catch (SocketException ex)
                {
                    if (ex.ErrorCode == 10054)
                    {
                        ConnSocket.Close();
                    }
                }
                catch (ObjectDisposedException)
                { }
            }