Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];

Вниз

как правельно работатать с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
2-1202739868
patrick1968
2008-02-11 17:24
2008.03.09
Проблема с написанием Service а


2-1202659042
Strate
2008-02-10 18:57
2008.03.09
Скрыть вкладки в TPageControl


3-1192611419
Ksander
2007-10-17 12:56
2008.03.09
TreeVies &amp; IB


2-1202482584
Costia
2008-02-08 17:56
2008.03.09
как правельно работатать с indy


2-1202681835
Бэтман
2008-02-11 01:17
2008.03.09
Дата





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский