![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IdTCPServer vs IdTCPClient висят?? [D6, Win2k, WinXP]
Sanya-spb © (2003-11-24 16:20:00)
Добрый день(вечер)
как обычно... есть клиент, и есть сервак...
клиент:
берет файл, сжимает его, пакует в Stream вместе с доп инфой и шлет на сервер, ждет с сервака CRC и т.д. все сначала для другого файла...
сервер:
принимает stream, распаковывает, считает его CRC, отсылает CRC обратно,...
проблема в следующем: когда передаю большой файл, то после (успешного!!) приема первого файла все это хозяйство впадает в кому... (смотрю по процессорному датчику...) ни ошибок, ни чего... просто спим... щас покажу где...
===== Сервер (судя по логу с ним все в порядке): ======
if Command="UPLOAD"
then begin
inc(CurClient.UploadCMD);
Params:=TStringList.Create;
try ExtractParams(Line,Params);
Path:=Params.Values["path"];
Size:=Cardinal(StrToInt(Params.Values["size"]));
log("Upload: path=""+Path+"", Stream size="+Params.Values["size"],CurClient.LogFile);
finally Params.Free; end;
Path:=TCPRoot+SlashToBackSlash(Path);
if FileExists(Path) then log("-- File exists! I""ll rewrite it",CurClient.LogFile);
CompressedStream:=TMemoryStream.Create; log("++ Ok. Getting Stream ...",CurClient.LogFile);
try while (CompressedStream.Size<Size) and AThread.Connection.Connected
do begin
AThread.Connection.ReadBuffer(Buffer,1);
CompressedStream.Write(Buffer,1);
end;{}
if CompressedStream.Size=Size
then begin{} log("++ Ok. Extracting UnpackSize and CRC from stream...",CurClient.LogFile);
CompressedStream.Position:=0;
CompressedStream.Read(UnpackSize,SizeOf(UnpackSize));
CompressedStream.Read(strHashValue,SizeOf(strHashValue)); log("++ Ok. Decompressing...",CurClient.LogFile);
ZStream:=TDecompressionStream.Create(CompressedStream);
try FileStream:=TFileStream.Create(Path, fmCreate or fmOpenWrite or fmShareExclusive);
try if UnpackSize>0
then FileStream.CopyFrom(ZStream,UnpackSize); log("++ Ok. Generating CRC...",CurClient.LogFile);
IdHashCRC32:=TIdHashCRC32.Create;
try FileStream.Position:=0;
HashValue:=IdHashCRC32.HashValue(FileStream); log("++ Ok. Send CRC to Client",CurClient.LogFile);
AThread.Connection.WriteBuffer(HashValue,SizeOf(HashValue)); log("++ Ok. Free memory and Check CRC...",CurClient.LogFile);
finally IdHashCRC32.Free; end;
finally FileStream.Free; end;
if strHashValue<>HashValue
then begin
log("-- Bad CRC!! Removing file ""+Path+"" to BUGs",CurClient.LogFile);
if not MoveFile(PChar(Path),PChar(TCPRoot+"\BUGs\"+ExtractFileName(Path)))
then log("-- Can""t remove bad file ""+Path+""",CurClient.LogFile);
end;
finally ZStream.Free; end;
log("++ Ok.",CurClient.LogFile);
inc(CurClient.UploadOk);
end else begin
log("-- Bad Stream.Size",CurClient.LogFile);
end;{}
finally CompressedStream.Free; end;
end else if Command="MKDIR" ...
==================================
=========== Клиент (а вот по его логу видно что спит он на приеме CRC от сервера): ===============
function TService_ArisClient.Upload(localPath, toPath: string): integer;
var
FileStream: TFileStream;
CompressedStream: TMemoryStream;
ZStream: TCompressionStream;
IdHashCRC32: TIdHashCRC32;
UnpackSize: Cardinal;
HashValue: Cardinal;
servHashValue: Cardinal;
CompressionRate: single;
begin
Log("UPLOAD: ""+localPath+"" -> ""+toPath+""");
CompressedStream:=TMemoryStream.Create;
try
FileStream:=TFileStream.Create(localPath,fmOpenRead or fmShareDenyWrite);
try
IdHashCRC32:=TIdHashCRC32.Create;
try
FileStream.Position:=0;
HashValue:=IdHashCRC32.HashValue(FileStream);
finally
IdHashCRC32.Free; end;
FileStream.Position:=0;
UnpackSize:=FileStream.Size;
CompressedStream.Write(UnpackSize,SizeOf(UnpackSize));
CompressedStream.Write(HashValue,SizeOf(HashValue));
ZStream:=TCompressionStream.Create(clMax,CompressedStream);
try
ZStream.CopyFrom(FileStream,FileStream.Size);
CompressionRate:=ZStream.CompressionRate;
finally ZStream.Free; end;
Result:=FileStream.Size;
finally
FileStream.Free; end;
IdTCPClient.WriteLn("UPLOAD"#32"path="+toPath+#32"size="+IntToStr(CompressedStream.Size));
log("++ Compression rate="+FloatToStrF(CompressionRate,ffFixed,18,2));
CompressedStream.Position:=0; log("++ Open Write Buffer");
IdTCPClient.OpenWriteBuffer(); log("++ Ok. Sending Sream...");
IdTCPClient.WriteStream(CompressedStream); log("++ Ok. Close Write Buffer");
IdTCPClient.FlushWriteBuffer(); log("++ Ok. Flush Write Buffer");
IdTCPClient.CloseWriteBuffer; log("++ Ok. Free Compressed Stream");
finally
CompressedStream.Free; end; log("++ Ok. Get CRC");
// тут мы спим????
IdTCPClient.ReadBuffer(servHashValue,SizeOf(servHashValue)); log("++ Ok. Check CRC");
if HashValue=servHashValue
then begin
log("++ Ok");
end else begin
Result:=-1;
log("-- CRC Error");
end;
end;
=======================================
почему???
Reindeer Moss Eater (2003-11-24 16:24:00) [21]
Потому что с сервера не приходит CRC