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

Вниз

как правельно работатать с indy   Найти похожие ветки 

 
Costia   (2008-02-08 17:56) [0]

Уважаемые мастера помогите решить проблему так как самостоятельно не получается .

две программы общающиеся между собой по средствам компонента indy сервер работает на PDA, клиент на PC /

на PDA архитектура процессора arm операционка на платформе WinCe/ програмлю на Lazarus  и использую версию компонента 10.2.0.1
Автор: Chad Z. Hower (Kudzu) and the Indy Pit Crew - http://www.indyproject.org/

############# использую вот такой код :  #############################################
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
i:integer;
begin
if acontext.Connection.IOHandler.Readable then
readmessage.Add(acontext.Connection.IOHandler.ReadLn);

i:=0;
while i < sendmessage.count do
begin
acontext.Connection.IOHandler.WriteLn(sendmessage.Strings[0]);
sendmessage.Delete(0);
i:=i+1;
end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i,i2:integer;
begin

i:=0;
while i<readmessage.count do
begin
i2:=0;
while i2<fdmlist.count do
begin
if readmessage.strings[i]=fdmlist.Strings[i2] then
begin
sendmessage.Add(readmessage.Strings[i]);
readmessage.Delete(i);  i:=i-1;     break;
end;
i2:=i2+1;
end;
i:=i+1;
end;

i:=0 ;
while i<readmessage.Count do
begin
messages(readmessage.Strings[0]);
fdmlist.Add(readmessage.strings[0]);
readmessage.Delete(0);
i:=1+1;
end;

end;                    
======================================================
P.S function messages(s:string); выполняет действия по команде:
сама логика эстого способа такова: что  когда появляется команда ей приклеивается номер и клиент добавляет её в список   который в цикле  постоянно отправляется на сервер а удаляется из списка тока если сервер отошлет её обратно .на сервере  как только команда приходить её с равнивают со списком уже прешедших и если она дубл то отправляют обратно если нет то function message  &  список пришедших(FDMlist)

зачем использую такой долбанутый способ передачи ? использовал классический и команды пропадали в глубинах WI FI.
=============================================================
клиент пишу на Delphi 7  с родными компонентами  

проблема заключается в том что сервер теряет команды и самое фиговое что теряет он их не на всегда / они всплывают  заместо следущего сообщени . вот что выдает мониторинг на клиенте :
tcp1 otpravil 1+gong
tcp1 otpravil 1+gong
tcp1 otpravil 1+gong
tcp1 otpravil 1+gong
tcp1 prin9l 1+gong

tcp1 otpravil 2+gong
tcp1 otpravil 2+gong
tcp1 prin9l 1+gong
tcp1 otpravil 2+gong
tcp1 prin9l 1+gong
tcp1 otpravil 2+gong
tcp1 prin9l 2+gong
tcp1 prin9l 2+gong

tcp1 otpravil 3+gong
tcp1 otpravil 3+gong
tcp1 prin9l 2+gong
tcp1 otpravil 3+gong
tcp1 prin9l 3+gong

Извеняюсь за манеру письма . Подскажите пожалуйста как правельно решаются такие задачи ?


 
Costia   (2008-02-08 18:04) [1]

да и забыл сказать . можно былобы конечно это проигнорировать   , все ровно этот панковский код работает но дело в том что проблемма прогресирует и после 30 команд  эфекта надо ждать по 5 сек


 
sniknik ©   (2008-02-08 18:06) [2]

http://delphimaster.net/view/6-1189799328/


 
Costia   (2008-02-08 18:22) [3]

sniknik  
спасиб за наводку  но я навечек и струдом понимаю к чему вы там пришли  .
можеш подсказать что именно надо изменить а точнее где в компоненте надо исправить ошибку и как это делается .


 
Costia   (2008-02-08 18:36) [4]

а это есть компонент для инди
procedure TIdUDPListenerThread.Run;
var
 PeerIP: string;
 PeerPort : TIdPort;
 ByteCount: Integer;
begin
 if FBinding.Select(AcceptWait) then try
   // Doublecheck to see if we"ve been stopped
   // Depending on timing - may not reach here if it is in ancestor run when thread is stopped
   if not Stopped then begin
     SetLength(FBuffer, FServer.BufferSize);
     ByteCount := GStack.ReceiveFrom(FBinding.Handle, FBuffer, PeerIP, PeerPort, FBinding.IPVersion);
     SetLength(FBuffer, ByteCount);
     FBinding.SetPeer(PeerIP, PeerPort, FBinding.IPVersion);
     if FServer.ThreadedEvent then begin
       UDPRead;
     end else begin
       Synchronize(UDPRead);
     end;
   end;
 except
   // exceptions should be ignored so that other clients can be served in case of a DOS attack
   on E : Exception do
   begin
     FCurrentException := E.Message;
     FCurrentExceptionClass := E.ClassType;
     if FServer.ThreadedEvent then begin
       UDPException;
     end else begin
       Synchronize(UDPException);
     end;
   end;
 end;
end;


 
Costia   (2008-02-08 18:37) [5]

тоесть компонент для Lazarus


 
Slym ©   (2008-02-11 06:28) [6]

1. Потоко небезопасный доступ к спискам команд (sendmessage/readmessage)... решение: критические секции (TCriticalSection)
2. Порядок команд нарушается изза - Отправки в несколько соединений... спросишь - ОТКУДА? оттуда - из dTCPServer1Execute не должен выходить пока не порвется соединение, а ты прочитал, отправил и вышел... соединение рвется - если делается повторная отправка то уже на другом соединении... Решение: использовать 1 соединение, либо проверять его единичность в один момент времени.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
 while AContext.Connection.Connected do
 begin
   if AContext.Connection.IOHandler.Readable then
   begin
     Lock;
     try
       readmessage.Add(acontext.Connection.IOHandler.ReadLn);
     finally
       Unlock;
     end;
   end;
   while sendmessage.count>0 do
   begin
     Lock;
     try
       AContext.Connection.IOHandler.WriteLn(sendmessage.Strings[0]);
       sendmessage.Delete(0);
     finally
       Unlock;
     end;
   end;
 end;
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
8-1176205997
rexti
2007-04-10 15:53
2008.03.09
как перетащить текст


2-1202890066
arreke
2008-02-13 11:07
2008.03.09
Удалить самого себя


2-1202980099
bataniQ
2008-02-14 12:08
2008.03.09
Frame в Главной форме...


15-1201851717
homm
2008-02-01 10:41
2008.03.09
Осторожней, Москвичи!


15-1201902190
Kostafey
2008-02-02 00:43
2008.03.09
С днем рождения ! 2 февраля