我做了一个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);
}
一下是我的接受代码,具体位位协议规定的:
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);
}
fwrite( (filebag+11) , 1 , FILEPERLEN , stream );
new出来的空间可能超过了最后一次收到的数据,所以为最后一次往文件里写的时候要计算一下实际的数据的大小。
1。TCP方式接收数据不一定能够接收到完整的一个packet;
2。最后一个packet的大小一定小于FILEPERLEN