Re: записть TStream в соккет INDY
От: Stepochkin  
Дата: 13.12.05 10:27
Оценка:
Здравствуйте, artur_rnd82, Вы писали:

_>Пробую с импользованием INDY10 написать процедуру по передачи потока TStream, есть такой вот код для записи потока в соккет


_>procedure TarCustomTCPSocket.WriteStream(AStream: TStream; AHandler: TIdIOHandler; ASleep: Integer; AContext: TIdContext);

_>var DataSize, BlockSize: integer;
_> Buffer: TBytes;begin
_> try
_> DataSize:=AStream.Size;
_> AHandler.WriteLn(IntToStr(DataSize));
_> SetLength(Buffer,TCP_SOCKET_BUFFER_SIZE);
_> while AStream.Position < AStream.Size do
_> begin
_> BlockSize:=AStream.Read(Buffer,TCP_SOCKET_BUFFER_SIZE);
_> AHandler.WriteLn(IntToStr(BlockSize));
_>// AHandler.WriteBufferOpen;
_> AHandler.Write(Buffer);
_>// AHandler.WriteBufferClose;
_> end;
_> except
_> on e: exception do
_> begin
_> doError('___Write Stream ERROR!!!'+#13+e.Message,FContext);
_> end;
_> end;
_>end;


_>и процедура для чтения потока из соккета



_>procedure TarCustomTCPSocket.ReadStream(AStream: TStream; AHandler: TIdIOHandler; AContext: TIdContext = nil);

_>var DataSize, BlockSize, readed: integer;
_> Buffer: TBytes;
_>begin
_> try
_> DataSize:=AHandler.ReadInteger;
_> AHandler.RecvBufferSize:=TCP_SOCKET_BUFFER_SIZE;
_> readed:=0;
_> while DataSize>readed do
_> begin
_> BlockSize:=AHandler.ReadInteger;
_> readed:=readed+BlockSize;
_> doEvent(Format('reading %d bytes of %d',[BlockSize,DataSize]),AContext);
_> FHandler.ReadBytes(Buffer,BlockSize,false);
_> end;
_> except
_> on e: exception do
_> begin
_> doError('___Read Stream ERROR!!!'+#13+e.Message,FContext);
_> end;
_> end;
_>end;

_>Так вот на выполнении AHandler.Write(Buffer); в процедуре WriteBuffer прога вылетает с ошибкой

_>В чём может быть дело


Вместо Buffer передавай @Buffer[0]
Например вместо
BlockSize := AStream.Read(Buffer, TCP_SOCKET_BUFFER_SIZE);

нужно
BlockSize := AStream.Read(@Buffer[0], TCP_SOCKET_BUFFER_SIZE);


Иначе ты перезаписываешь размер массива и естественно Delphi сообщает об ошибке.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.