Форум: "Сети";
Текущий архив: 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 TReadThreadwhile 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