Нужна помощь по Indy10. передача файла.

Романыч84
Дата: 24.06.2009 12:35:48
Туплю уже второй день, передаю файл, о он приходит с левыми 4 первыми байтами, вот что в начале файла "яяяя". Indy 10. с 9-кой все работало прилично
Вот как я передаю-получаю
Клиент
  var
    Fs : TFileStream;
    FsVCL : TIdStreamVCL;
begin
...
Fs := TFileStream.Create(loc,fmOpenRead,fmShareDenyRead);
FsVCL:=TIdStreamVCL.Create(Fs);
WriteBufferOpen;
Write(FsVCL,Fs.Size,false); 
WriteBufferClose;
...

Сервер
Fs:=TMemoryStream.Create;
FsVCL:=TIdStreamVCL.Create(Fs);
ReadStream(FsVCL,FileSize,False);
Fs.Position:=0;
fs.SaveToFile(FilePath);
FreeAndNil(Fs);
FreeAndNil(FsVCL);
Романыч84
Дата: 25.06.2009 04:36:16
Неужели ни кто не сталкивался?
Альт
Дата: 25.06.2009 05:02:47
Проверять лень, но зачем вы делаете:
Fs.Position:=0;
Если первым в потоке приходит размер, что... в принципе... типично для поточников...
1. считал первым размер
2. выставили размер в буфере
3. зачитали поток в буфер
4. сбросили на диск
Романыч84
Дата: 25.06.2009 05:30:27
да это уже от отчаяния. я не передаю размер
Write(FsVCL,Fs.Size,false);
Проверял в отладчике, когда происходит копирование, в буфере сидят уже 4 байта, и они пишутся в начало потока
  
procedure TIdIOHandler.ReadStream(AStream: TIdStreamVCL; AByteCount: Integer;
  AReadUntilDisconnect: Boolean);
...  
// If data already exists in the buffer, write it out first.
    if FInputBuffer.Size > 0 then begin
      i := Min(FInputBuffer.Size, LWorkCount);
      FInputBuffer.ExtractToStream(AStream, i);
      Dec(LWorkCount, i);
    end;
Anatoly Podgoretsky
Дата: 25.06.2009 09:03:59
"яяяя". - это не размер, это $FFFFFFFF

--
http://www.podgoretsky.com
JohnS
Дата: 25.06.2009 09:47:36
К слову , в INDY 10 какойто херни наворотили >:-((
Романыч84
Дата: 25.06.2009 10:23:46
Anatoly Podgoretsky
"яяяя". - это не размер, это $FFFFFFFF

--
http://www.podgoretsky.com

Я знаю, и не пойму откуда такая бяка лезет
Альт
Дата: 25.06.2009 12:28:27
понятия не имею, как вы компилируете свой код... написал простейший пример:
+
program SendFile;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes,
  IdContext, IdIOHandler, IdTCPClient, IdTCPServer;

const
  CPORT = 9999;
  CHOST = 'localhost';
  CTestFile = 'c:\test.txt';
  CResultFile = 'c:\test.out';

type
  TDummyClass = class
  protected
    class procedure Server;
    class procedure Client;
    class procedure Send( IOHandler : TIdIOHandler; const AFileName : String );
    class procedure Execute(AContext: TIdContext);
  end;

{ TDummyClass }

class procedure TDummyClass.Server;
begin
  with TIdTCPServer.Create do
  try
    DefaultPort := CPORT;
    OnExecute := Execute;
    Active := true;
    Client;
  finally
    Free
  end;
end;

class procedure TDummyClass.Client;
begin
  with TIdTCPClient.Create do
  try
    Port := CPORT;
    Host := CHOST;
    Connect;
    Send( IOHandler, CTestFile );
    Disconnect;
  finally
    Free
  end;
end;

class procedure TDummyClass.Execute(AContext: TIdContext);
var
  Stream : TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    with AContext.Connection, IOHandler do
    try
      ReadStream( Stream, ReadLongInt( true ), false );
      WriteLn( 'OK' );
      Stream.SaveToFile( CResultFile );
    finally
      Disconnect;
    end;
  finally
    FreeAndNil( Stream );
  end;
end;

class procedure TDummyClass.Send(IOHandler: TIdIOHandler;
  const AFileName: String);
var
  FileStream : TFileStream;
begin
  FileStream := TFileStream.Create( AFileName, fmOpenRead, fmShareDenyNone );
  with IOHandler do
  try
    Write( FileStream, -1, true );
    ReadLn;
  finally
    FreeAndNil( FileStream );
  end;
end;

begin
  TDummyClass.Server;
end.
Романыч84
Дата: 25.06.2009 16:37:08
я понял ской косяк, я передавал методом write размер файла, а на клиенте читал readinteger, когда в старом проекте было writeln. Как т олько переделал, все заработало. Я уже тоже написал простенькое, там все получилось.
Честно говоря я не понял почему такое произошло, почему метод write засорял буфер, хотя все данные забирались с буфера?
Альт
Дата: 25.06.2009 18:00:25
Я не видел вашего кода, а только рваные куски... подсказать не могу. Код написал.