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

Вниз

Indy + TCPServer + "Connected" = проблемы   Найти похожие ветки 

 
Ozone ©   (2006-03-27 15:45) [0]

Добого дня!

Есть устройства - раьотают как tcp-сервера. Есть жаление написать программу для работы с этими "серверами". В первоначальном варианте - "запрос/ответ".

Суть проблемы позже, сначала напишу как делаю. Создал массив записей:
TServer = record
   Desc: string[30];
   XPortIP: string[15];
   Client: TIdTCPClient;
   ReadThread : TReadThread;
   ConnectedThread: TConnectedThread;
 end;


Заполняю массив из БД.
while not ADOData.Eof do begin
 {...}
 Servers[serv_count].Client := TIdTCPClient.Create(nil);
end;


Потом сделал таймер:
for i:=0 to serv_count-1 do begin
   if not Servers[i].Client.Connected then begin
       Servers[i].ConnectedThread := TConnectedThread.Create(true);
       Servers[i].ConnectedThread.ServerID := i;
       Servers[i].ConnectedThread.FreeOnTerminate := true;
       Servers[i].ConnectedThread.Resume;
   end
   else
       Servers[i].Client.WriteLn(ECHO_REQUEST);
   end;


Процедура Execute TConnectedThread

   while not Terminated do begin
      if Servers[ServerID].Client.Connected then Terminate
      else begin
        try
           Servers[ServerID].Client.Connect();
           // если не Connect, то нижние операторы ф топку
           Servers[ServerID].ReadThread := TReadThread.Create(true);
           Servers[ServerID].ReadThread.ServerID := ServerID;
           Servers[ServerID].ReadThread.FreeOnTerminate := true;
           Servers[ServerID].ReadThread.Resume;
           Terminate;
        except
          //  заглушка
        end;
      end;
      sleep(3000);
    end;


Тело процедуры Execute TReadThread
   while not Terminated do begin
      if not Servers[ServerID].Client.Connected then Terminate
      else begin
        Command := Servers[ServerID].Client.Readln();
        Synchronize(Output);
        if Command = ALARM_MSG then
          sndPlaySound("alarm.wav", SND_ASYNC);
      end;
    end;


Так вот, к самой проблеме - в таймере, когда соедининия еще никакого нету (сервер даже не запустил), он с "удовольствием" проглатывает условие if not Servers[i].Client.Connected и начинает писать в сокет :( Servers[i].Client.WriteLn(ECHO_REQUEST);

Может чего я с логикой напутал?

Заранее спасибо!


 
Сергей М. ©   (2006-03-27 15:55) [1]

Куда тебе такая туча серверов ? Солить ?)...


 
Ozone ©   (2006-03-27 16:00) [2]

Сергей М. ©   (27.03.06 15:55) [1]

Есть устройство XPort (http://www.rodnik.ru/htmls/pr_110403.htm). И оно может работать только как сервер (по определению). Мне нужно "общаться" с ними...


 
Сергей М. ©   (2006-03-27 16:06) [3]


> оно может работать только как сервер


Т.е. готовое серверное устройство.


> Мне нужно "общаться" с ними


Значит ты - клиент этих серверов.
Ну и какого ж .. ты пишешь серверный код, если ты - "клиент" ?


 
Ozone ©   (2006-03-27 16:08) [4]

Сергей М. ©   (27.03.06 16:06) [3]

Ну и какого ж .. ты пишешь серверный код, если ты - "клиент" ?

Извини, не совсем понял, что ты имел в виду? В каком именно месте он "серверный"? Создаю клиентов, коннектю их, посылаю запрос, получаю ответ....


 
Ozone ©   (2006-03-27 16:10) [5]

Сергей М. ©   (27.03.06 16:06) [3]

Т.е. каждый экземпяр TIdTCPClient я коннектю к определенному серверу.


 
Сергей М. ©   (2006-03-27 16:15) [6]


> Ozone ©   (27.03.06 16:10) [5]


Угу .. теперь понял ..


> проглатывает условие if not Servers[i].Client.Connected
> и начинает писать в сокет :( Servers[i].Client.WriteLn(ECHO_REQUEST);
>


значит Connected = True


 
Ozone ©   (2006-03-27 16:21) [7]

Сергей М. ©   (27.03.06 16:15) [6]

Да, получается, что так, НО в каком месте он становиться TRUE - вот в чем загадка для меня... Может в том монент, когда в нити TConnectedThread идет Connect(), свойство становиться TRUE (сервер при этом не запущен!!!) и поэтому при обращении к нему в процедуре таймера возникает такая лажа? Хотя слабо вериться...


 
Сергей М. ©   (2006-03-27 16:26) [8]

Зачем тебе тот самый таймер - ума не приложу..


 
Ozone ©   (2006-03-27 16:32) [9]

Сергей М. ©   (27.03.06 16:26) [8]

Чтобы сделать что-типа "echo request / echo reply". Просто сеть не очень надежная и нужно не только постоянно ее "оживлять", но и своевременно узнавать о disconnect - и при этом запускать нить, которая до победного будет пробовать соединиться. Вот...


 
Ozone ©   (2006-03-27 16:34) [10]

Т.е. просто, скажем, каждые 10 секунд проверяю соединение всех клиентов, если его нет, запускаю нить для соединения, если есть отсылаю "echo requert"


 
Сергей М. ©   (2006-03-27 16:38) [11]


> Ozone ©   (27.03.06 16:34) [10]


На и есть тот самый thread, который ты запускаешь, чтобы  контролировать соединение от начала до конца.

Пропало соединение ? Thread извещает об этом контролирующий его поток и завершается. Контролирующий поток, получив извещение, рестартует thread


 
Ozone ©   (2006-03-27 16:53) [12]

Сергей М. ©   (27.03.06 16:38) [11]

Да, действительно :) Сглупил :) Спасибо, наставили на верный путь :) Вроде заработало. Сейчас еще проверю одновременно на нескольких клиентов.



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

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

Наверх




Память: 0.5 MB
Время: 0.049 c
6-1143499893
Vovanchik
2006-03-28 02:51
2006.08.13
WebBrowser и его содержимое


2-1153692356
Soubi
2006-07-24 02:05
2006.08.13
добавление компонента


8-1139918799
MatrixSh!t
2006-02-14 15:06
2006.08.13
OpenGL или DirectX


1-1151466158
hgd
2006-06-28 07:42
2006.08.13
Детектор движения


2-1153993191
Геннадий
2006-07-27 13:39
2006.08.13
запрос SQL