Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

---|Ветка была без названия|---


Страницы:   1 2 3 4 5 6 7

h0use ©   (2003-10-30 12:28:00) 

Уважаемые мастера,
есть проблема, используется компонета indy idTCPServer отладил на обыкновенной аппликации процес соединения и передачи данных клиенту, затем перенес этот код в Сервис. НО, теперь клиент не может достучаться до сервера. Видимо теперь сервер стартует с правами System. А как сделать так, чтоб он стартовал с правами хотя бы администратора? Или вообще как сделать, чтоб клиент таки достучался до сервера в сервисе?


h0use   (2003-11-04 13:11:00) [1]

Все хорошо, кроме одного НО, сервис-то стартует, т.е. как по логике, если started:=false то и в сервисах мы видим, что он не должен показываться как Start, а у меня-то он наоборот стартует.


Digitman   (2003-11-04 12:35:00) [2]


> "#100061 Connection refused


означает что сервер не стартовал

вопреки твоему утверждению [119] что, якобы, "Сервер стартует"


> в логах пишется какая-то лабуда


не "лабуда", а реакция сервис-менеджера на невозможность найти зарегистрированное описание для EventType = 1 (EVENTLOG_ERROR_TYPE) и ID=0

лезем в хэлп и не вылазим оттуда, пока не наводим в голове порядок :

Sends an error message to the event log.

procedure LogMessage(Message: String; EventType: DWord = 1; Category: Integer = 0; ID: Integer = 0);

Description

LogMessage sends an error message to the event log when an error or exception occurs. By default the EventType is EVENTLOG_ERROR_TYPE (usually indicating a loss of functionality or data) and the category and ID are zero. For example, if a service cannot be loaded as the system boots, it can log an error event, and the category and ID are zero.

The EventType specifies the type of event being logged. This parameter can be one of the following values:

Value Meaning

EVENTLOG_ERROR_TYPE Error event

EVENTLOG_WARNING_TYPE Warning event

EVENTLOG_INFORMATION_TYPE Information event

EVENTLOG_AUDIT_SUCCESS Success Audit event

EVENTLOG_AUDIT_FAILURE Failure Audit event

The Category parameter specifies the event category, which is source-specific information and can have any value.

The ID parameter specifies the event identifier, which is the message that goes with this event as an entry in the message file associated with the event source.

После наведения в голове порядка делаем резюме : "лабуда" есть реакция на вызов тобой метода LogMessage() в событии TService.OnStart (в предположении, что LogMessage с ID=0 более нигде кроме TService.OnStart/OnStop в тексте парограммы не фигурирует). Если LogMessage был вызван, то это означает только одно - произошло исключение при вызове TCPServer.Active := True, и сервер не перешел в активное состояние. Если он не стал активным, то сервис не стартует ! Согласно моемупростейшему отладочному варианту кода... А это означает , что ты снова пытаешься мне лапшу вешать.


h0use   (2003-11-04 12:07:00) [3]

Дык я и оставил только OnStart и OnStop, как ты сказал...если яуберу OnExecute TCP сервера, куда же мне вешать обработку соединения?


Digitman   (2003-11-04 11:57:00) [4]


> h0use


я устал нянькаться с тобой


> Имеет, в том то и дело!


я тебе что сказал в [118] ?

>> толькоOnStart и OnStop

ты, сударь, упрям как осел и не слушаешь что тебе говорят !

По-русски ты, видимо, слабо понимаешь, а исходные тексты Борланда читать и изучать (во свое же благо) не желаешь

продолжай в том же духе))... успехов !


h0use   (2003-11-04 10:52:00) [5]

Имеет, в том то и дело!


Reindeer Moss Eater   (2003-11-04 10:37:00) [6]

Если [118], то
TIdTCPServer не имеет обработчика OnExecute.


h0use   (2003-11-04 10:29:00) [7]

Спасибо за оптимизацию моего бреда, тперь програма перешла в новый статус - клиент при попытке законнектится пишет "#100061 Connection refused"Сервер стартует, но в логах пишется какая-то лабуда, не могу разобрать что бы это значило:
"The description for Event ID ( 0 ) in Source ( BAServer.exe ) 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: The service process could not connect to the service controller."


Digitman   (2003-11-01 11:56:00) [8]

значит, так : выкидывай все что ты там понаворочал, кроме обработчиков событий TCPServer, и реализуй простейшие обработчики событий сервиса - только OnStart и OnStop

procedure TBAService.ServiceCreate(...);
begin
TCPServer:=TIdTCPServer.Create(Self);
end;

procedure TBAService.ServiceStart(Sender: TService; var Started: Boolean);
begin
try
... инициализация параметров объекта TCPServer ...
TCPServer.Active := True;
Started := TCPServer.Active
except
on e: exception do
LogMessage("Exception raised in OnStart : " + e.ClassName + " " + e.Message);
end;
end;

procedure TBAService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
try
TCPServer.Active := False;
Stopped := not TCPServer.Active;
except
on e: exception do
LogMessage("Exception raised in OnStop : " + e.ClassName + " " + e.Message);
end;
end;


h0use   (2003-10-31 17:59:00) [9]

Убрал его. В принципе он и не мешал.


Reindeer Moss Eater   (2003-10-31 17:52:00) [10]

Да и там он опционален.


Reindeer Moss Eater   (2003-10-31 17:52:00) [11]

TIdAntiFreeze нужен исключительно в GUI приложениях.


Digitman   (2003-10-31 17:41:00) [12]


> If calls are made in the main thread


угу ...
молодца ! сам-то читал-вникал в цитату ??

ты из в main thread в дан.случае делаешь, эти самые calls ???????
ну ни фига головой думать не хочешь !!

содрал код один в один, совершенно бездумно, и думаешь после этого, что все должно само собой работать !!


h0use   (2003-10-31 17:37:00) [13]


> Digitman © (31.10.03 17:34) [111]
>
> > Это чтоб не засыпал сокет
>
>
> С какого ... он должен "заснуть" ? И что значит "заснуть"
> ? Где ты этих дурацких терминов, смысла которых не понимаешь,
> нахватался ?

Prevents an application UI from freezing.

TIdAntiFreeze = class(TIdAntiFreezeBase)

Unit

IdAntiFreeze

Description

Indy works on the blocking model. That is when calls are made to Indy the do not return until they are complete. If calls are made in the main thread this will cause the Application User Interface to "freeze" during Indy calls. TIdAntiFreeze counter acts this effect. TIdAntiFreeze allows Indy subsystem to make process Application message calls so that Windows messages continue to be executed while Indy blocking socket calls are in effect.

Only one TIdAntiFreeze can be active in an application. If another instance already exists, an exception is raised. TIdAntiFreezeBase uses the global variable GAntiFreeze, declared in the TIdAntiFreezeBase unit, to determine if another instance has already been created.

Note: GAntiFreeze is not assigned if an instance is added in the form designer (during design time).

Note: The TIdAntiFreeze.pas unit must NOT appear in the uses clause of any Indy or descendant unit. This unit is linked in an application when the component is placed on a Form. This is done to preserve isolation from the Forms.pas and QForms.pas units.


h0use   (2003-10-31 17:35:00) [14]

А его раньше не было, я добавил чтоб Delphi warnings не писала, что у меня параметр не проинициализирован, в принципе кроме как на разбухание программы эта строчка ни на что не влияет. Потом в многих примерах гуру в инете я видил аналогичную начальную инициализацию Result в функциях


Digitman   (2003-10-31 17:34:00) [15]


> Это чтоб не засыпал сокет


С какого ... он должен "заснуть" ? И что значит "заснуть" ? Где ты этих дурацких терминов, смысла которых не понимаешь, нахватался ?


Digitman   (2003-10-31 17:32:00) [16]

function TBAService.ServerStop:Boolean;
begin
Result:=True;
// какого ... сначала безусловный True, а потом уже вся логика обработчика ? успешное выполнение которой собственно и должно давать повод для True ?
end;


h0use   (2003-10-31 17:28:00) [17]


> > AntiFreeze:=TIdAntiFreeze.Create(Self);

Это чтоб не засыпал сокет

>
> > TCPServer.Active:=True; // first step
> ......
> > Clients:=TList.Create; // next step

Это после того как мне посоветовали создавать объект в ручную при старте сервиса, раньше было просто TCPServer.Active:=True?
Ну у код воткнул не сомтря...спасибо за наводку...FIXED


Digitman   (2003-10-31 17:20:00) [18]

о божен !!! о боже !!! какой кошмар !!!


> AntiFreeze:=TIdAntiFreeze.Create(Self);


это что ? это зачем ?


> TCPServer.Active:=True; // first step
......
> Clients:=TList.Create; // next step


что за несуразица ? почему не наоборот ? почему список, используемый в транспортных потоках, создается ПОЗЖЕ активизации сервера ? ведь тр.потоки к нему обращаются !!

безобразный код !!!


h0use   (2003-10-31 17:20:00) [19]


> выполнились без исключений, НО не выполнили успешно ожидаемую
> от них логику

Это собственно как? Если выполнились успешно, то они будут True, если не успешно, то они False. Сервер отдает True, я уже проверял, не работает только БД, которая пока итак не задействована, поэтому я в пилотном варианте и поставил True на Started.


Digitman   (2003-10-31 17:14:00) [20]

и с какого хрена

Started := True;

???

а если все предыдущие операторы в теле OnStart() выполнились без исключений, НО не выполнили успешно ожидаемую от них логику ?


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо