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

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

как правельно работатать с indy [D7, XP]


Costia ©   (2008-02-08 17:56:00) 

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

две программы общающиеся между собой по средствам компонента 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


Slym   (2008-02-11 06:28:00) [1]

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;


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

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


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

а это есть компонент для инди
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:22:00) [4]

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


sniknik   (2008-02-08 18:06:00) [5]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1189799328&n=4


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

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


Наверх

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