Главная страница
    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.039 c
2-1153741979
rsa_
2006-07-24 15:52
2006.08.13
не запускаеться exe-шник написанный на delphi6 в windowsXP


2-1153487386
bajenovv
2006-07-21 17:09
2006.08.13
помогите плиз !!!!


3-1149506429
DmiSb
2006-06-05 15:20
2006.08.13
Какие компоненты лучше использовать для доступа к MS SQL ?


15-1152786620
Igor_
2006-07-13 14:30
2006.08.13
Система документации для Delphi


2-1153900388
Wolferio
2006-07-26 11:53
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский