Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-49519
oens
2004-01-03 09:23
2004.01.16
Сраванение


3-49403
Alex-kosmonavt
2003-12-16 18:42
2004.01.16
Редактор справочников


1-49620
Крутыш
2004-01-03 21:56
2004.01.16
Как вычислить координаты курсора???


1-49638
Brut
2004-01-04 14:54
2004.01.16
Как использовать типы и классы в различных модулях.


1-49488
Yuri Btr
2004-01-03 16:05
2004.01.16
Восстановление и минимизация окон





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