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

Вниз

Теряються данные, как исправить?   Найти похожие ветки 

 
pavia   (2004-08-23 00:22) [0]

Есть две программы клиент и сервер.Сервер по запросу передает размер следующего пакета данных и сам пакет.Клиент посылает запрос и принемает данные,НО иногда данные теряються.
//сервер
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
VAR P:POINTER;
begin
with AThread.Connection do
 begin
 ReadBuffer(BUF,SIZEOF(BUF));
 case  BUF[1] of
 0  :BUF[1]:=100;
 200:begin
     WriteBuffer(streaminfo,sizeof(streaminfo));
     BUF[1]:=500;
     end;
 210:begin
     WriteBuffer(srcfmt^,sizeof(TBITMAPINFOHEADER));
     BUF[1]:=510;
     end;
 220:begin
     buf[1]:=l1;//Размер данных в srcdata^
     WriteBuffer(buf,sizeof(buf));
     WriteBuffer(srcdata^,l1);
     BUF[1]:=520;
     end;
 end;
 WriteBuffer(BUF,SIZEOF(BUF));

 end;
end;

//клиент в таймере
 with IdTCPClient1 do
 begin
 Connect;
 try
 buf[1]:=220;
 WriteBuffer(buf,sizeof(buf));
 ReadBuffer(buf,sizeof(buf));
 if srcdata<>nil then freemem(srcdata);
 if buf[1]<>0 then  begin
    getmem(srcdata,buf[1]);
    ReadBuffer(srcdata^,buf[1]);//Здесь виснет,но не всегда.
 end;
 IdTCPClient1.RecvBufferSize:=16;
 ReadBuffer(buf,sizeof(buf));
 finally
 IdTCPClient1.RecvBufferSize:=16;
 Disconnect;
 end;
 end;

Кто знает где ошибка?Или как обойти зависание, когда нет данных?
Буду признателен за любую помощь.


 
Piter ©   (2004-08-23 03:52) [1]

Так вопросы не задаются... оттрасируй программу, посмотри значения переменных. А потом грамотно сформулируй вопрос и приведи именно проблемное узкое место, а не такой листинг...


 
Erik1   (2004-08-23 10:51) [2]

Посмотри пример для Indy там есть работа с ICP сервером.


 
pavia   (2004-08-23 12:15) [3]


> Так вопросы не задаются... оттрасируй программу, посмотри
> значения переменных. А потом грамотно сформулируй вопрос
> и приведи именно проблемное узкое место, а не такой листинг...

Поожолуйста могу у горотить листинг.А проблемное место выделеть.
//сервер
    buf[1]:=l1;//Размер данных в srcdata^
    WriteBuffer(buf,sizeof(buf));
    WriteBuffer(srcdata^,l1);
    BUF[1]:=520;

//Клиент в таймере
ReadBuffer(buf,sizeof(buf));
if srcdata<>nil then freemem(srcdata);
if buf[1]<>0 then  begin
   getmem(srcdata,buf[1]);
   ReadBuffer(srcdata^,buf[1]);//Здесь виснет,но не всегда.
end;


 
Digitman ©   (2004-08-23 13:19) [4]


> pavia   (23.08.04 12:15) [3]


> //Здесь виснет,но не всегда.


и правильно "виснет" - режим гнезда-то блокирующий !

до тех пор пока со стороны передатчика не придут все данные, которые ты запросил в ReadBuffer(), ф-ция эта не вернет управления следующему за ней оператору


 
atruhin ©   (2004-08-23 13:23) [5]

На сервере ты сначала пишешь данные потом размер буфера, а на клиенте читаешь в обратном порядке. Это как минимум, а вот это вообще то галиматья какая то написана:
 IdTCPClient1.RecvBufferSize:=16;
ReadBuffer(buf,sizeof(buf));
finally
IdTCPClient1.RecvBufferSize:=16;
Disconnect;


 
atruhin ©   (2004-08-23 13:26) [6]

И вообще исходник в вопросе и в [3] отличаются принципиально, ты уж определись о каком спрашиваешь?



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

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

Наверх




Память: 0.48 MB
Время: 0.062 c
3-1096624461
stud
2004-10-01 13:54
2004.10.31
использование параметра в хранимой процедуре


1-1097756321
Izyum
2004-10-14 16:18
2004.10.31
Работа с потоками


1-1097907829
acsoft
2004-10-16 10:23
2004.10.31
Как по известному Handle программы узнать её расположение на диск


14-1097582942
Суслик
2004-10-12 16:09
2004.10.31
Спам роботы


1-1098256346
Ega23
2004-10-20 11:12
2004.10.31
Закрытие формы по Escape