Форум: "Система";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
h0use (2003-10-30 12:28) [0]Уважаемые мастера,
есть проблема, используется компонета indy idTCPServer отладил на обыкновенной аппликации процес соединения и передачи данных клиенту, затем перенес этот код в Сервис. НО, теперь клиент не может достучаться до сервера. Видимо теперь сервер стартует с правами System. А как сделать так, чтоб он стартовал с правами хотя бы администратора? Или вообще как сделать, чтоб клиент таки достучался до сервера в сервисе?
← →
Reindeer Moss Eater (2003-10-30 12:30) [1]Права админа и учетная запись сервиса никак не влияют на твою проблему
← →
h0use (2003-10-30 12:31) [2]
> Reindeer Moss Eater © (30.10.03 12:30) [1]
> Права админа и учетная запись сервиса никак не влияют на
> твою проблему
А что тогда? Почему не работает?
← →
Spinx (2003-10-30 12:40) [3]Твоя служба запускается раньше службы TCP/IP.
поставь в Dependencies твоей службы, службу TCP/IP, тогда все пучком будет. И не забудь при старте сервиса активизировать TCPServer.
С уважением Александр.
← →
Reindeer Moss Eater (2003-10-30 13:05) [4]Скорее всего все намного проще.
Смотреть 17 строку.
← →
h0use (2003-10-30 13:10) [5]
> Reindeer Moss Eater © (30.10.03 13:05) [4]
> Скорее всего все намного проще.
> Смотреть 17 строку.
строку чего?
← →
Reindeer Moss Eater (2003-10-30 13:11) [6]строку чего?
Конституции острова Борнео.
Твоего исходника сервиса разумеется!
← →
Reindeer Moss Eater (2003-10-30 13:13) [7]Кстати суметь запуститься то TCP - это суметь еще надо.
← →
h0use (2003-10-30 13:24) [8]Ты имеешь ввиду ServiceStart?
← →
Reindeer Moss Eater (2003-10-30 13:28) [9]Ничего я не имею ввиду кроме того что сказал
← →
h0use (2003-10-30 13:32) [10]Понимаешь в чем дело, во-первых мой текущий юнит сервиса слегка видоизменился вчера и сегодня, во-вторых то что я публиковал в форуме имеет пропуски, а 17 строка указывает на описание процедуры ServiceStart, поэтому я и спаршиваю что ты имел ввиду, если уж лень писать, то хоть скопируй сюда через буфер сроку на которой ты хочешь акцентировать внимание.
← →
Digitman (2003-10-30 13:35) [11]
> h0use
все что происходит в обработчиках событий OnStart, OnStop, OnExecute сервиса, происходит в доп.код.потоке
если серверный компонент, создаваемый в этом доп.код.потоке, предусматривает асинхр.режим с использованием оконных нотификаций, то доп.код.поток должен предусматривать цикл ожидания/выборки/диспетчеризации оконных сообщений
иначе сервер будет "мертв" для клиента
← →
Reindeer Moss Eater (2003-10-30 13:39) [12]Там синхронный режим
← →
h0use (2003-10-30 13:48) [13]Так, я начал запутываться, так все же как надо правильно делать?
На ум приходит только одно, создавать в сервисе поток, а потом уже в потоке создавать свой TCP сервак и коннект к БД. Но ведь сервис это итак уже поток, значит создавать подпоток - это возможно излишне. Потом сам инди сервер создает свой серверный поток...
Я лично делал как Борланд предлагает в хелпе на примере сокет сервера.
Я первый раз связался с потоками и сервисами.
← →
Digitman (2003-10-30 13:50) [14]
> Reindeer Moss Eater
возможно.
я просто не в курсе.
если так, то нужно точно знать диагностику отказов, получаемых клиентом при попытках коннекта к серверу.
иначе дальнейший разговор с автором бесплодный
← →
Digitman (2003-10-30 14:01) [15]
> h0use © (30.10.03 13:48) [13]
самый простой и "правильный" вариант для объекта-блок.сервера, создаваемого в доп.потоке сервиса :
procedure TMySvc.ServiceStart(Sender: TService; var Started: Boolean);
begin
try
MyServer := TIdTCPServer.Create(...);
... инициализируем параметры сервера
... активизируем сервер
if сервер_активизирован then
Started := True;
except
on e: Exception do
LogMessage(e.ClassName + " " + e.Message, ...); //лог причины отказа в инициализации или активизации сервера
end;
end;
procedure TMySvc.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
try
FreeAndNil(MyServer); // деактивируем и уничтожаем сервер
Stopped := True;
except
on e: Exception do
LogMessage(e.ClassName + " " + e.Message, ...); //лог причины отказа в деактивации и уничтожении объекта-сервера
end;
end;
← →
h0use (2003-10-30 14:03) [16]Это как раз просто, клиент при попытки коннекта пишет "Socket error #10053 Software caused connection abort"
← →
Digitman (2003-10-30 14:04) [17]
> h0use
а обработку события сервиса OnExecute не назначай без осознанной надобности
← →
Digitman (2003-10-30 14:12) [18]
> h0use © (30.10.03 14:03) [16]
> Это как раз просто
а зачем сложней ? какую доп.функциональность сервиса и сервера в нем ты хотел привнести кроме этой "простоты" ?
> "Socket error #10053 Software caused connection abort"
это означает, что соединение клиента с сервером было успешно установлено, но в ходе выполнения клиентом ф-ций send() или recv() произошел отказ транспорта по превышению тайм-аута ожидания
WSAECONNABORTED The virtual circuit was terminated due to a time-out or other failure. The application should close the socket as it is no longer usable.
← →
h0use (2003-10-30 14:23) [19]Это понятно...сейчас все переделываю на правильный лад, но попути возник вопрос по Инди. Есть строка TCPServer.Intercept:=NetLogEvent; на ней делфа ругается, что несовместимость типов, НО NetLogEvent - это TidLogEvent - наследник от TidServerIntercept, а TCPServer.Intercept именно этот класс и требует, тогда почему ошибка? В демках инди точно такая же строчка компилется без ошибок...
Понимаю, что не в этом треде это обсуждать, но пока я там с сервисом воюю, может мысли у кого будут...
← →
h0use (2003-10-30 14:29) [20]Теперь уже по серверу, все здорого, вроде запустилось, НО почему-то трижды вызывает метод onStart
← →
Digitman (2003-10-30 14:29) [21]
> h0use
Сожалею, но я не пользую Инди. Принципиально. Представляю лишь концептуально внутреннюю организацию. Хэлпа под рукой нет.
← →
Reindeer Moss Eater (2003-10-30 14:33) [22]Hierarchy
TidBaseComponent->TidConnectionIntercept->TidLogBase->TIdLogEvent
TidBaseComponent->TidServerIntercept
property Intercept: TIdServerIntercept;
Как видим, своему компилятору надо верить.
← →
Digitman (2003-10-30 14:37) [23]
> h0use
кто Sender ? один и тот же объект-наследник TService ?
если - да, то подозрения таковы :
OnStart() не возвращает Started = True
следовательно, если в св-вах сервиса фигурирует
First Failure = Restart Service
Second Failure = Restart Service
SubSequent Failures <> Restart Service
то ты как раз и получаешь ту самую картину, что наблюдаешь (с троекратной попыткой стартовать один и тот же сервис)
← →
h0use (2003-10-30 14:45) [24]Sender вообще у меня nil...а где в свойствах сервиса фигурирует выше приведенный алгоритм?
← →
Reindeer Moss Eater (2003-10-30 14:50) [25]Он фигурирует в свойствах OC
← →
h0use (2003-10-30 14:55) [26]Если вы имеете ввиду Recovery закладку, то там у меня все выключено. А сервис стартует все арвно два раза...
← →
Reindeer Moss Eater (2003-10-30 14:59) [27]Ты в [23] все буквы прочитал?
Чему равно Started в OnStart?
← →
Digitman (2003-10-30 15:00) [28]
> h0use © (30.10.03 14:45) [24]
> Sender вообще у меня nil
быть того не может.
это объект-источник события (в дан.случае - конкретный объект-наследник класса TService). Спрашивается, КТО возбудил событие, если Sender = nil ? С какого перепугу он будет = nil, если это факт.параметр формируется не тобой, а объектом TServiceThread, однозначно ассоциированным с конкретным экз-ром объекта-сервиса ?
> где в свойствах сервиса фигурирует выше приведенный алгоритм?
открой консоль Services, найди там свой сервис, вызови его Свойства, в свойствах есть закладка Recovery - вот там и смотри установки текущие для данного сервиса
← →
Digitman (2003-10-30 15:03) [29]
> А сервис стартует все арвно два раза...
ну ты в протоколе-то (консоль Events) посмотри в конце-концом, что сервис-менеджер системный говорит по этому поводу !!
← →
h0use (2003-10-30 15:08) [30]
> Digitman © (30.10.03 15:00) [28]
>
> > h0use © (30.10.03 14:45) [24]
>
> быть того не может.
> это объект-источник события (в дан.случае - конкретный объект-наследник
> класса TService). Спрашивается, КТО возбудил событие, если
> Sender = nil ? С какого перепугу он будет = nil, если это
Сейчас у меня вот так
TCPServer:=TIdTCPServer.Create(nil);
← →
Reindeer Moss Eater (2003-10-30 15:09) [31]Мда...
← →
Digitman (2003-10-30 15:15) [32]
> h0use
> Сейчас у меня вот так
> TCPServer:=TIdTCPServer.Create(nil);
бросил бы ты пока сервисами заниматься) ... таки действительно не самое простое дело)
а у тебя - пробелы в элементарных знаниях, не имеющих никакого отношения к сервисам !
где ? где ты увидел Sender"а в том что ты привел только что ??
← →
h0use (2003-10-30 15:21) [33]
> Reindeer Moss Eater © (30.10.03 14:59) [27]
> Ты в [23] все буквы прочитал?
> Чему равно Started в OnStart?
Я телаю вот так:
Started := True;
LogMessage(BoolToStr(Started));
Только я не могу понять куда он это записывает
← →
h0use (2003-10-30 15:29) [34]
> Digitman © (30.10.03 15:15) [32]
> где ? где ты увидел Sender"а в том что ты привел только
> что ??
По идее сендер у меня Сервис
← →
Digitman (2003-10-30 15:37) [35]
> Только я не могу понять куда он это записывает
сказал же тебе - открой консоль Events в Administrative Tools, там все и увидишь
> По идее сендер у меня Сервис
что значит "по идее" ? ты это проверил ?
← →
h0use (2003-10-30 15:51) [36]В Events ничего не появилось :( Только то что сервис успешно загружен и запущен есть еще такой текст:
"The description for Event ID ( 0 ) in Source ( BAService ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: -1."
А как узнать кто сендер? Я же в дебуг не могу вйти :(
← →
Digitman (2003-10-30 16:11) [37]
> Только то что сервис успешно загружен и запущен
с чего ты взял тогда, что OnStart() многократно вызывается ?
> как узнать кто сендер? Я же в дебуг не могу вйти
тяжко у тебя с отладкой, чувствую) ... не владеешь даже самыми элементарными (примитивнейшеми !) принципами !
if Sender = nil then
MessageBox(...) // или LogMessage(то-то)
else if Sender is TMyService then
MessageBox(...) // или LogMessage(то-то)
else if Sender = Self then
MessageBox(...) // или LogMessage(то-то)
← →
h0use (2003-10-30 16:28) [38]
> с чего ты взял тогда, что OnStart() многократно вызывается
> ?
А с того что у меня внутренний логгер работает, он и показывает что дважды запускается...блин я бы сунул бы сюда код сервиса, да только размер сообщения не позволяет, очень сложно говрить когда уже куча процедур и функций наваяно, может где-то в другом месте бага...
← →
Digitman (2003-10-30 16:40) [39]
> А с того что у меня внутренний логгер работает
в событии OnStart() он работает ?
а чем хуже логгера банальнейший MessageBox() ? уж куда проще) ... с логгером ты вполне мог и намудрить, а уж если MessageBox(0, "Заголовок", "Сообщение", mb_ok) выполнится, то тут уж от факта никуда не отвертишься : сколько раз появится диал.окно, столько раз и OnStart() было вызвано ...
ну и LogMessage() ничем не хуже, кстати ... и даже корректней/безопасней во многих случаях ...
← →
h0use (2003-10-30 16:57) [40]Короче, стартует вроде один раз, создаю все объекты при старте как create(self), но все арвно клиент не может ничего отправить на сервер
Страницы: 1 2 3 4 вся ветка
Форум: "Система";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.13 c