我做了一个Socket传输的程序的客户端,在接包,组包的时候,用了一个for循环接收包然后写入一个文件的末尾,for循环体内每次开一缓冲区,写入后,释放!但是组包后的文件都不跟原来的一样,末尾不对,对了我拿.exe试失败了,拿,txt文件写,则末尾不对,哪位大侠能帮我解决一下,太谢谢了!!!!
一下是我的接受代码,具体位位协议规定的:
    void  CMyDlg::FileRecv( int cLen)
{

   sendcount = (cLen/FILEPERLEN)+((cLen%FILEPERLEN)?1:0);
  
   FILE * stream;  
  
   CString filepath = "c:\\pan.txt";
  
   if((stream = fopen((LPCTSTR)(filepath),"ab"))==NULL)////创建文件
{
::exit(0);
}
  
 for( f_i=1; f_i<=sendcount; f_i++)
    {  byte *filebag = new byte[TRANS_LEN+FILEPERLEN];   
    
 int realLen = recv(RecSocket,(char *)filebag, TRANS_LEN+FILEPERLEN ,0);  u_short f_bagLen = *((u_short *)(filebag+4));

 unsigned char f_comd = *((unsigned char *)(filebag+6));  int f_softID = *((int *)(filebag+7));

 fseek(stream, 0L, SEEK_END);
    
    // fwrite( (filebag+11) , 1 , FILEPERLEN , stream );
 fwrite( (filebag+11) , 1 , FILEPERLEN , stream );  /*char  huixian = *((char *)(filebag+11));
 AfxMessageBox(huixian);*/
    
 delete[] filebag;
 //////////////////////////////////////

  Sleep(100);//测试效果的地方,以后要去掉,会造成延时
  
  m_Progress.SetPos(f_i * 100 / sendcount);
     
    
 //////////////////////////////////////   }
     fclose(stream);
}

解决方案 »

  1.   

    byte *filebag = new byte[TRANS_LEN+FILEPERLEN];  
    fwrite( (filebag+11) , 1 , FILEPERLEN , stream );
     
    new出来的空间可能超过了最后一次收到的数据,所以为最后一次往文件里写的时候要计算一下实际的数据的大小。
      

  2.   

    两个问题请注意:
    1。TCP方式接收数据不一定能够接收到完整的一个packet;
    2。最后一个packet的大小一定小于FILEPERLEN
      

  3.   

    我这个程序用来接收,recv函数的位置可以放在for循环体里面吗?整个接收的流程有问题吗?那位大侠可以回答下啊,谢谢!!!