SendBuf与ReceiveBuf数据不一致。
//文件传输的问题,发送速度一快,就会出现发送数据和接收数据不一致,发的多,接的少,有时发的少接的多。郁闷死了。
//下面是原代码。看看问题出在那里了。谢谢。分数不多了。只能上这么些了。
filepart=flen;(文件长度。以前是文件块数,但有问题,接收发送块不一致,就改成文件字节数了。)
filepart_len=0;//已发送的长度,用来在文件类中定位取数据用。
void __fastcall TMain::clsoketConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
if(filepart_send==0)
Socket->SendText("\3\3\3\3"+t_filename+"*"+IntToStr(flen));
}
//---------------------------------------------------------------------------
void __fastcall TMain::svsoketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Application->ProcessMessages();
if(!recfile_bool)
{
AnsiString Msgs=Socket->ReceiveText();
recfile_bool=true;
if(Msgs.SubString(1,4)=="\3\3\3\3")
{
filenowlen=StrToInt(Msgs.SubString(Msgs.LastDelimiter("*")+1,Msgs.Length()-Msgs.LastDelimiter("*"))) ;
Msgs=Msgs.SubString(1,Msgs.LastDelimiter("*")-1);
if(!r_filename.Trim().IsEmpty())
Msgs=r_filename+Msgs.SubString(Msgs.LastDelimiter("\\"),Msgs.Length()-Msgs.LastDelimiter("\\"));
else
Msgs=ExtractFilePath(Application->ExeName)+Msgs.SubString(Msgs.LastDelimiter("\\")+1,Msgs.Length()-Msgs.LastDelimiter("\\"));
r_filename=Msgs;
if(FileExists(r_filename))
DeleteFile(r_filename);
fh=FileCreate(r_filename);
Socket->SendText("\1\1\1\1#0");
return;
}
}
else
{
char buff[8192];
int reclen=0;
FileSeek(fh,0,2);
do
{
reclen=Socket->ReceiveBuf(buff,sizeof(buff));
if(reclen>0)
{
recnum=recnum+reclen;
if(!FileWrite(fh,buff,reclen))
ShowMessage("写入错误!");
}
//Sleep(1);//这里加上Sleep(1)后,接收就正常了。但速度奇慢。局域网内!
}while(reclen>0);
cg1->Progress=recnum/(filenowlen/100);
if(recnum==filenowlen)
{
recfile_bool=false;
FileClose(fh);
svsoket->Close();
pnl1->Visible=false;
ShowMessage("接收结束!");
return;
}
if(Socket->Connected)
{
Socket->SendText("\1\1\1\1#"+IntToStr(recnum));
}
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TMain::clsoketRead(TObject *Sender,
TCustomWinSocket *Socket)
{
char buf[8192];
AnsiString getstr="";
getstr=Socket->ReceiveText();
if(getstr.SubString(1,4)=="\1\1\1\1")
{
unsigned long receivelen=StrToInt(getstr.SubString(getstr.LastDelimiter("#")+1,getstr.Length()-5));
//if(filepart_send!=receivelen)
// ShowMessage("error");
filepart_send=receivelen;
if(filepart_send==filepart && filepart>0)
{
pnl1->Visible=false;
ShowMessage("发送结束!");
filestream->Free();
return;
}
int readlen=0;
int sendlen=0;
filestream->Seek(filepart_send,soFromBeginning);
readlen=filestream->Read(buf,sizeof(buf));
if(sendlen=Socket->SendBuf(buf,readlen))
{
filepart_send=filepart_send+sendlen;
cg1->Progress=filepart_send/(filepart/100);
cg1->Refresh();
}
if(filepart_send>=filepart && filepart>0)
{
pnl1->Visible=false;
ShowMessage("发送结束!");
filestream->Free();
}
}