записть TStream в соккет INDY
От: artur_rnd82  
Дата: 13.12.05 09:34
Оценка:
Пробую с импользованием 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 прога вылетает с ошибкой
В чём может быть дело
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 сообщает об ошибке.
Re[2]: записть TStream в соккет INDY
От: artur_rnd82  
Дата: 13.12.05 13:02
Оценка:
Здравствуйте, Stepochkin, Вы писали:

в процедуре WriteBuffer прога вылетает с ошибкой_>>В чём может быть дело


S>Вместо Buffer передавай @Buffer[0]

S>Например вместо
S>
S>BlockSize := AStream.Read(Buffer, TCP_SOCKET_BUFFER_SIZE);
S>

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


S>Иначе ты перезаписываешь размер массива и естественно Delphi сообщает об ошибке.


Спасибо огромное, проблема решена
Re: записть TStream в соккет INDY
От: artur_rnd82  
Дата: 14.12.05 09:37
Оценка:
Вот вощникла ещё одна проблема

как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток.
так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....
Заранее спасибо за помощь
Re[2]: записть TStream в соккет INDY
От: Oleg A. Bachin Украина  
Дата: 14.12.05 10:02
Оценка:
Здравствуйте, artur_rnd82, Вы писали:

_>Вот вощникла ещё одна проблема


_>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток.

_>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....

а ты что хотел? положить в ящичек грушку, а достать яблочко?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[3]: записть TStream в соккет INDY
От: artur_rnd82  
Дата: 14.12.05 11:00
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>Здравствуйте, artur_rnd82, Вы писали:


_>>Вот вощникла ещё одна проблема


_>>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток.

_>>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....

OAB>а ты что хотел? положить в ящичек грушку, а достать яблочко?


Я спросил совета а не нравоучений, если ты такой умный то скажи в чём причина
Re[3]: записть TStream в соккет INDY
От: artur_rnd82  
Дата: 14.12.05 11:02
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>Здравствуйте, artur_rnd82, Вы писали:


_>>Вот вощникла ещё одна проблема


_>>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток.

_>>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....

Продолжу, пробовал писать и DataSize:=IntToStr(AHandler.ReadLn), , не получается в любом случаи
Re[4]: записть TStream в соккет INDY
От: OdesitVadim Украина  
Дата: 14.12.05 11:12
Оценка:
Здравствуйте, artur_rnd82, Вы писали:

_>Здравствуйте, Oleg A. Bachin, Вы писали:


OAB>>Здравствуйте, artur_rnd82, Вы писали:


_>>>Вот вощникла ещё одна проблема


_>>>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток.

_>>>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....

OAB>>а ты что хотел? положить в ящичек грушку, а достать яблочко?


_>Я спросил совета а не нравоучений, если ты такой умный то скажи в чём причина

Ты пишеш как строку WriteLn(IntToStr(DataSize)) (это от 1 до несколько байт в ANSI кодировке)
а читаеш как число — тоесть 4 байта.
Определись — е всё будет класс. Я бы предпочёл писать так AHandler.WriteInteger(DataSize)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: записть TStream в соккет INDY
От: Oleg A. Bachin Украина  
Дата: 14.12.05 12:16
Оценка:
Здравствуйте, artur_rnd82, Вы писали:

_>Продолжу, пробовал писать и DataSize:=IntToStr(AHandler.ReadLn), , не получается в любом случаи


сядь, разберись и не паникуй, поскольку то что ты пишешь не только не могло заработать, а и не могло собраться. с таким подходом "пхнуть одну строчку и назад в форум" ты ничему не научишься. ведь ты именно этим занимаешься, а не проект пишешь, поскольку там такого кода не будет по определению.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[4]: записть TStream в соккет INDY
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 14.12.05 15:25
Оценка:
Здравствуйте, artur_rnd82, Вы писали:

_>Продолжу, пробовал писать и DataSize:=IntToStr(AHandler.ReadLn), , не получается в любом случаи


Если пишешь integer — читай integer, если строку — читай строку. А ты пишешь строку а читаешь integer. Тебя не удивляет, что на конструкции типа String:=Integer; Delphi обламывается?
WBR, Dmitry Beloshistov AKA [-=BDS=-]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.