![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
h0use © (2003-10-30 12:28:00)
Уважаемые мастера,
есть проблема, используется компонета indy idTCPServer отладил на обыкновенной аппликации процес соединения и передачи данных клиенту, затем перенес этот код в Сервис. НО, теперь клиент не может достучаться до сервера. Видимо теперь сервер стартует с правами System. А как сделать так, чтоб он стартовал с правами хотя бы администратора? Или вообще как сделать, чтоб клиент таки достучался до сервера в сервисе?
Reindeer Moss Eater (2003-10-30 14:50:00) [101]
Он фигурирует в свойствах OC
h0use (2003-10-30 14:45:00) [102]
Sender вообще у меня nil...а где в свойствах сервиса фигурирует выше приведенный алгоритм?
Digitman (2003-10-30 14:37:00) [103]
> h0use
кто Sender ? один и тот же объект-наследник TService ?
если - да, то подозрения таковы :
OnStart() не возвращает Started = True
следовательно, если в св-вах сервиса фигурирует
First Failure = Restart Service
Second Failure = Restart Service
SubSequent Failures <> Restart Service
то ты как раз и получаешь ту самую картину, что наблюдаешь (с троекратной попыткой стартовать один и тот же сервис)
Reindeer Moss Eater (2003-10-30 14:33:00) [104]
Hierarchy
TidBaseComponent->TidConnectionIntercept->TidLogBase->TIdLogEvent
TidBaseComponent->TidServerIntercept
property Intercept: TIdServerIntercept;
Как видим, своему компилятору надо верить.
h0use (2003-10-30 14:29:00) [105]
Теперь уже по серверу, все здорого, вроде запустилось, НО почему-то трижды вызывает метод onStart
Digitman (2003-10-30 14:29:00) [106]
> h0use
Сожалею, но я не пользую Инди. Принципиально. Представляю лишь концептуально внутреннюю организацию. Хэлпа под рукой нет.
h0use (2003-10-30 14:23:00) [107]
Это понятно...сейчас все переделываю на правильный лад, но попути возник вопрос по Инди. Есть строка TCPServer.Intercept:=NetLogEvent; на ней делфа ругается, что несовместимость типов, НО NetLogEvent - это TidLogEvent - наследник от TidServerIntercept, а TCPServer.Intercept именно этот класс и требует, тогда почему ошибка? В демках инди точно такая же строчка компилется без ошибок...
Понимаю, что не в этом треде это обсуждать, но пока я там с сервисом воюю, может мысли у кого будут...
Digitman (2003-10-30 14:12:00) [108]
> 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.
Digitman (2003-10-30 14:04:00) [109]
> h0use
а обработку события сервиса OnExecute не назначай без осознанной надобности
h0use (2003-10-30 14:03:00) [110]
Это как раз просто, клиент при попытки коннекта пишет "Socket error #10053 Software caused connection abort"
Digitman (2003-10-30 14:01:00) [111]
> 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;
Digitman (2003-10-30 13:50:00) [112]
> Reindeer Moss Eater
возможно.
я просто не в курсе.
если так, то нужно точно знать диагностику отказов, получаемых клиентом при попытках коннекта к серверу.
иначе дальнейший разговор с автором бесплодный
h0use (2003-10-30 13:48:00) [113]
Так, я начал запутываться, так все же как надо правильно делать?
На ум приходит только одно, создавать в сервисе поток, а потом уже в потоке создавать свой TCP сервак и коннект к БД. Но ведь сервис это итак уже поток, значит создавать подпоток - это возможно излишне. Потом сам инди сервер создает свой серверный поток...
Я лично делал как Борланд предлагает в хелпе на примере сокет сервера.
Я первый раз связался с потоками и сервисами.
Reindeer Moss Eater (2003-10-30 13:39:00) [114]
Там синхронный режим
Digitman (2003-10-30 13:35:00) [115]
> h0use
все что происходит в обработчиках событий OnStart, OnStop, OnExecute сервиса, происходит в доп.код.потоке
если серверный компонент, создаваемый в этом доп.код.потоке, предусматривает асинхр.режим с использованием оконных нотификаций, то доп.код.поток должен предусматривать цикл ожидания/выборки/диспетчеризации оконных сообщений
иначе сервер будет "мертв" для клиента
h0use (2003-10-30 13:32:00) [116]
Понимаешь в чем дело, во-первых мой текущий юнит сервиса слегка видоизменился вчера и сегодня, во-вторых то что я публиковал в форуме имеет пропуски, а 17 строка указывает на описание процедуры ServiceStart, поэтому я и спаршиваю что ты имел ввиду, если уж лень писать, то хоть скопируй сюда через буфер сроку на которой ты хочешь акцентировать внимание.
Reindeer Moss Eater (2003-10-30 13:28:00) [117]
Ничего я не имею ввиду кроме того что сказал
h0use (2003-10-30 13:24:00) [118]
Ты имеешь ввиду ServiceStart?
Reindeer Moss Eater (2003-10-30 13:13:00) [119]
Кстати суметь запуститься то TCP - это суметь еще надо.
Reindeer Moss Eater (2003-10-30 13:11:00) [120]
строку чего?
Конституции острова Борнео.
Твоего исходника сервиса разумеется!