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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
2-1153676677
cando
2006-07-23 21:44
2006.08.13
Самый быстрый способ узнать размер папки


6-1139988013
maep
2006-02-15 10:20
2006.08.13
SOAP, вызов метода веб сервиса


15-1153191625
tButton
2006-07-18 07:00
2006.08.13
support


10-1122965770
KVA
2005-08-02 10:56
2006.08.13
встраивание ActiveX формы


2-1153987112
Vovan2006
2006-07-27 11:58
2006.08.13
Возможна ли обработка ситуации выгрузки программы в самой програм





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский