Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Проблема с переполнением буфера :(   Найти похожие ветки 

 
dream   (2005-01-28 10:58) [0]

Подскажите почему в ниже преведёном коде происходит переполнение буфера при длительной работе ( 10 - 15 мин )
Сам код служит для принятия картинки - файла по сети ( клиент работает на отлично а сервак вылетает :(  )

private
   { Private declarations }
   Reciving: boolean;
   DataSize: integer;
   Data: TMemoryStream;

procedure Tvidform.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s, sl: string;
begin
 s:= Socket.ReceiveText;
 if not Reciving then
 begin
   SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
   StrLCopy(@sl[1], PChar(s), Length(sl)-1);
   DataSize:= StrToInt(sl);
    Data:= TMemoryStream.Create;
   Delete(s, 1, Length(sl));
   Reciving:= true;
 end;

 try
   Data.write(s[1], length(s));
   if Data.Size = DataSize then
   begin
     Data.Position:= 0;
     Image1.Picture.Bitmap.LoadFromStream(Data);
     Data.Free;
     Reciving:= false;
   end;
 except
   Data.Free;
 end;
end;

Уже второй день мучаюсь , пробывал создавать Data в form create но тогда передача не происходит почему то , я думаю что переполнение происходит при постоянном создании объекта , но если его создать вначале программы как я говорил то картинка не хочет приниматься ...


 
Digitman ©   (2005-01-28 12:26) [1]

передача/прием бин.данных (размер транслируемого потока и собственно следующие за размером данные картинки в потоке) с пом. методов SendText/ReceiveText как минимум неуместны
type
 TRecvMode = (rmImageSize, rmImageData);
private
  { Private declarations }
  Mode: TRecvMode;
  BytesNeedToRead: Integer;  
  ImageSize: Integer;
  ImageData: TMemoryStream;

procedure Tvidform.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
 Mode := rmImageSize;
 BytesNeedToRead := SizeOf(ImageSize);
end;

procedure Tvidform.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
 FreeAndNil(ImageData);
end;

procedure Tvidform.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorCode: Integer);
begin
 FreeAndNil(ImageData);
 ErrorCode := 0;
end;

procedure Tvidform.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
len : Integer;
begin
case Mode of

 rmImageSize:
 begin
   len := Socket.ReceiveBuf(PByteArray(@ImageSize)[SizeOf(ImageSize) - BytesNeedToRead], BytesNeedToRead);
   Dec(BytesNeedToRead, len);
   if BytesNeedToRead = 0 then
     begin
       ImageData := TMemoryStream.Create;
       ImageData.Size := ImageSize;
       Mode := rmImageData;
       BytesNeedToRead := ImageSize;
     end;
 end;

 rmImageData:
 begin
   len := Socket.ReceiveBuf(PByteArray(ImageData.Memory)[ImageSize - BytesNeedToRead], BytesNeedToRead);
   Dec(BytesNeedToRead, len);
   if BytesNeedToRead = 0 then
     begin
       try
         try
           Image1.Picture.Bitmap.LoadFromStream(ImageData);
         except
           Socket.Close;
         end;
         Mode := rmImageSize;
         BytesNeedToRead := SizeOf(ImageSize);
       finally
         FreeAndNil(ImageData);
       end;
     end;
 end;

end;

s:= Socket.ReceiveText;
if not Reciving then
begin
  SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
  StrLCopy(@sl[1], PChar(s), Length(sl)-1);
  DataSize:= StrToInt(sl);
   Data:= TMemoryStream.Create;
  Delete(s, 1, Length(sl));
  Reciving:= true;
end;

try
  Data.write(s[1], length(s));
  if Data.Size = DataSize then
  begin
    Data.Position:= 0;
    Image1.Picture.Bitmap.LoadFromStream(Data);
    Data.Free;
    Reciving:= false;
  end;
except
  Data.Free;
end;
end;

..

передатчик же (пример для блок.режима) делает так :

var
  ImageSize: Integer;
  ImageData: TMemoryStream;
..
//создает поток и грузит в него данные картинки
..
 ImageSize := ImageData.Size;
 Socket.SendBuf(ImageSize, SizeOf(ImageSize)); //4 байта - размер потока
 Socket.SendBuf(ImageData.Memory^, ImageSize); //собственно картинка размером ImageSize байт


 
dream   (2005-01-28 12:37) [2]

> Digitman ©   (28.01.05 12:26) [1]

Спасибо попробую


 
dream   (2005-01-28 12:41) [3]

> Digitman ©   (28.01.05 12:26) [1]

Жалуеться на TRecvMode не могу понять что это и
type
TRecvMode = (rmImageSize, rmImageData);

то же что то не получаеться вставить :(


 
Digitman ©   (2005-01-28 13:30) [4]

какого ж шута ты занялся криент-серверными технологиями, если даже Паскаль не знаешь ?


 
dream   (2005-01-28 13:46) [5]

Ну во первых я с паскаля и не начинал :)  
TRecvMode не найден не в справке к delphi не в инете ... может это и мелочь которую каждый школьник знает но я её к сожалению не могу найти , если не трудно подскажи пожалуйста.


 
Digitman ©   (2005-01-28 14:12) [6]


> dream   (28.01.05 13:46) [5]


> я с паскаля и не начинал


ты в дан.случае работаешь в Паскале.
и ищешь помощи в реализации алгоритма на нем же.
значит, должен как ОТЧЕ НАШ знать правила написания кода в паскале.


> TRecvMode не найден не в справке к delphi не в инете


откуда он там возьмется-то ?
ты же видишь - я использовал директиву type.
значит я объявляю СОБСТВЕННЫЙ тип.
так вот в Паскале объявлять собственные типы допустимо не где попало, а в строго определенных разделах Паскаль-модуля. Надеюсь, ЭТО не подлежит сомнению ?


 
ТехникПТО ©   (2005-01-28 14:16) [7]

гыы... паскаль сила :)


 
dream   (2005-01-28 14:27) [8]

> ты в дан.случае работаешь в Паскале.

Я в данном случае работаю в Delphi 6

И обявление типов я никогда не использовал .. хотя уе писал более менее нормальнае продукты :) бывает и такое

Спасибо за помощь , дальше я думаю сам разберусь


 
Digitman ©   (2005-01-28 14:36) [9]


> Я в данном случае работаю в Delphi 6


ты работаешь в СРЕДЕ БЫСТРОЙ РАЗРАБОТКИ ПРОГРАММ.
среда в качестве базового использует ПАСКАЛЬ (точнее Object Pascal) в кач-ыве ЯЗЫКА ПРОГРАММИРОВАНИЯ.

Разницу между СРЕДОЙ РАЗРАБОТКИ ПРОГРАММ и ЯЗЫКОМ ПОРГРАММИРОВАНИЯ осюсяешь или нет ?


 
Digitman ©   (2005-01-28 14:41) [10]


> обявление типов я никогда не использовал


А рано или поздно придется.
Ставишь мышиный курсор в зону идентификатора якобы незнакомой тебе директивы type, жмешь F1, читаешь станд.справку до полного просветления в голове либо до потери пульса. Третьего не дано.


 
dream   (2005-01-28 14:51) [11]

> Digitman ©   (28.01.05 14:41) [10]

Разобрался ! :) Спасибо за помощь , сейчас буду юзать код , проверять


 
dream   (2005-01-28 16:07) [12]

> Digitman ©  

Большое спасибо ! Код работает отлично как и нужно было.
Очень благодарен. :)


 
Digitman ©   (2005-01-28 16:26) [13]


> dream   (28.01.05 16:07) [12]


надеюсь, ты НЕ упустил ВАЖНОГО комментария


> пример для блок.режима


?



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
1-1111061252
Uncle Archi
2005-03-17 15:07
2005.03.27
ExtractIcon


8-1102796840
Iks
2004-12-11 23:27
2005.03.27
Draw on Desktop


14-1110363553
R.D.I.
2005-03-09 13:19
2005.03.27
Сайт kladovka.com.ru приостановил работу?


1-1110979999
Alex_C
2005-03-16 16:33
2005.03.27
Не могу создать в RealTime TRxGIFAnimator


11-1093533393
Владимир
2004-08-26 19:16
2005.03.27
StretchDraw