Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Теряються данные, как исправить? [D6, WinXP]


pavia ©   (2004-08-23 00:22:00) 

Есть две программы клиент и сервер.Сервер по запросу передает размер следующего пакета данных и сам пакет.Клиент посылает запрос и принемает данные,НО иногда данные теряються.
//сервер
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;

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


atruhin   (2004-08-23 13:26:00) [1]

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


atruhin   (2004-08-23 13:23:00) [2]

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


Digitman   (2004-08-23 13:19:00) [3]


> pavia   (23.08.04 12:15) [3]


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


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

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


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


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

Поожолуйста могу у горотить листинг.А проблемное место выделеть.
//сервер
    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;


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

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


Piter   (2004-08-23 03:52:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо