Форум: "Сети";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизТеряються данные, как исправить? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.032 c