![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
h0use © (2003-10-30 12:28:00)
Уважаемые мастера,
есть проблема, используется компонета indy idTCPServer отладил на обыкновенной аппликации процес соединения и передачи данных клиенту, затем перенес этот код в Сервис. НО, теперь клиент не может достучаться до сервера. Видимо теперь сервер стартует с правами System. А как сделать так, чтоб он стартовал с правами хотя бы администратора? Или вообще как сделать, чтоб клиент таки достучался до сервера в сервисе?
h0use (2003-10-31 15:14:00) [41]
Дая просто вчера не ту апликацию запускал, я тут урывками софт пишу от основной работы, вот и путаю иногда, а сегодня вот посвободней и я точные данные выдаю. А они описаны в [82]
Digitman (2003-10-31 15:09:00) [42]
> h0use
ну хорошо, предположим что не выполняется
какого ж ... тогда ты мне мозги паришь, что
> Жирная строчка выполняется
??
Digitman (2003-10-31 15:07:00) [43]
> Reindeer Moss Eater
и я - про него !
про обработчик TidTCPServer.OnExecute !
при чем здесь TService.OnExecute и CommandHandlers ?
это уже давно проехали - событие TService.OnExecute он якобы, по моему настоянию, не назначает и не обрабатывает никак, TCPServer он стартует в TService.OnStart, останавливает в TService.OnStop
все просто д.б. как божий день - никакие TService.OnExecute нас не волнуют вообще
h0use (2003-10-31 15:04:00) [44]
> а обработчик OnExecute(), согласно последним "веяниям",
> не вызывается)))))
Последние "веяниия" реальны...выполнялась она только когда я в аплекухе отлаживал, сейча до нее даже не доходит. OnExecute не выполняется вообще!
Reindeer Moss Eater (2003-10-31 14:59:00) [45]
Я же про обработчик OnExecute, а не про метод Execute треда
Digitman (2003-10-31 14:58:00) [46]
кто-то из вас точно лапшу вешает)
>Жирная строчка выполняется
не мое утверждение - автора !
а выполняется она, будучи вызванная из обработчика OnExecute()
а обработчик OnExecute(), согласно последним "веяниям", не вызывается)))))
лыко-мочало, поехали сначала)
клоунада))
Digitman (2003-10-31 14:52:00) [47]
> Reindeer Moss Eater © (31.10.03 14:28) [76]
не-а)
вот теперь и ты еще мне лапшу вешаешь)
не поленился я найти этот хваленый Инди и вижу там совершенно иное:
procedure TIdThread.Execute;
begin
try
while not Terminated do try
if Stopped then begin
Suspended := True; // thread manager will revive us
if Terminated then begin
Break;
end;
end;
BeforeRun;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while not Stopped do begin
Run; //
end;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
finally
AfterRun;
end;
except
on E: exception do begin
FTerminatingException := E.Message;
//уверен, что автор не обрабатывает это событие ! Оно - для Пушкина)
if Assigned(FOnException) then
FOnException(self, E);
//погасили исключение, закругляемся
Terminate;
end;
end;
end;
procedure TIdPeerThread.Run;
begin
try
// пока назначен обработчик, исполняем его
if not Connection.Server.DoExecute(Self) then begin
raise EIdNoExecuteSpecified.Create(RSNoExecuteSpecified);
end;
except
// сюда вываливаемся по любому необработанному исключению в теле OnExecute()
on E: EIdSocketError do begin
case E.LastError of
Id_WSAECONNABORTED, // WSAECONNABORTED - Other side disconnected
Id_WSAECONNRESET:
Connection.Disconnect;
end;
end;
on EIdClosedSocket do ;
else
//сюда, скорей всего, и попадаем, т.к. исключение - не транспортного уровня, где-то просто ляп
raise;
end;
// If connetion lost, stop thread
if not Connection.Connected then begin
Stop;
end;
end;
Reindeer Moss Eater (2003-10-31 14:45:00) [48]Объясняю твое заблуждение насчет Copy & Paste кода.
Код можно перенести один в один. Но можно забыть перенести таким же методом компонент сервера, от свойств которого работоспособность зависит не меньше чем от кода.
Например:
В gui приложении у сервера не определены CommandHandlers, а в сервисном приложении они есть.
Можно хоть запереноситься кодом туда и обратно, но в сервисном приложении событие OnExecute не возникнет вообще.
И сервис тут совсем ни пришей ни пристегни. Виноваты созданные коммандхендлерс у компонента сервера.
h0use (2003-10-31 14:39:00) [49]
Господа, я конечно все понимаю, что я туп и глуп, НО я поставил ловушку в самом начале метода OnExecute, и она тоже не сработала! Т.е. В этот метод вообще при коннекте не поадаем. Но когда я весь код один в один перенес в обычную апликацию, все сразу заработало. Можно считать меня тупым, но я не буду начинать писать непонятный для меня сервис, если у меня не отлажена обработка соединения. Так вот, все процедуры приведенные мной работают безошибочно если они работают в обычном приложении, а не в сервисе. Собственно поэтому я и создал тред.
Reindeer Moss Eater (2003-10-31 14:28:00) [50]
есть еще один вариант - OnExecute вызывается всякий раз когда буфер приема гнезда не пуст
Именно так.
Вот типичный код OnExecute
procedure SomeIndyServerOnExecute(AThread:TidPeerThread);
begin
GlobalStringVar:= GlobalStringVar + Athread.Connection.ReadChar;
if GlobalStringVar = "Пора меня отключать нафик" then AThread.Connection.Disconnect;
end;
Прекращения соединения с клиентом не происходит при выходе из обработчика (если самому не закрыть соединения).
Digitman (2003-10-31 14:24:00) [51]
> Reindeer Moss Eater © (31.10.03 14:05) [70]
> Там иная логика.
я не спорю. может быть и так.
есть еще один вариант - OnExecute вызывается всякий раз когда буфер приема гнезда не пуст
внеси ясность, если код под рукой
внеси так же ясность в реакцию TIdPeerThread на необработанное в теле OnExecute() исключение... код в том виде, в котором он приведен у автора, просто безобразен - нет ни одного блока обработки исключений
факт в том что автор в обработчике OnExecute() ЯВНО вызывает метод OnDisconnect(), это видно из кода, и автор утверждает, что вызов действительно происходит ! но там я, как видишь, расставил ловушки, обойти которые невозможно - хотя бы одна да сработает !
кроме того, если сервер выполняет в какой-то момент времени дисконнект, то обработчик OnDisconnect будет вызван еще раз, автоматически.. а это уже факт, вполне объясняющий отказ 10053 на кл.стороне... но я не вижу вызова тела OnDisconnect() ни явно ни автоматом ! Или он мне лапшу на уши вешать продолжает) ... а мне это уже изрядно поднадоело)
Reindeer Moss Eater (2003-10-31 14:17:00) [52]
Вот только не надо мне объяснять какая там логика.
Сначала разберись со своим проектом.
h0use (2003-10-31 14:09:00) [53]
> Там иная логика.
> С толку сбивает напрашивающаяся аналогия с Сервис.OnExecute
> когда сервис завершен при выхоже из метода.
Если уж на то пошло то там логика как у TThread.execute и когда все это работало не в сервисето поток сервера прерывался только когда его терминировали (либо ручками либо при "отвале" клиента), и это при всем при том, что OnExecute отрабатывал еще только при логине.
Reindeer Moss Eater (2003-10-31 14:07:00) [54]
Digitman
Оставь ты человека.
От тебе незнакомые слова и комбинации таких слов из своего проекта кидает и это ему нравится.
h0use (2003-10-31 14:06:00) [55]
Я же уже писал, никакого, буд-то он вообще не выполняется...ни один контрольный бокс поставленный мной в тобой указанных местах не срабатывает, кроме бокса сигнализируещего, что сервер таки запустился
Reindeer Moss Eater (2003-10-31 14:05:00) [56]
А клоню я к тому, что как только метод TBAService.TCPServerExecute завершит свое исполнение, то по идее сервер должен автоматически разорвать соединение с клиентом.
Там иная логика.
С толку сбивает напрашивающаяся аналогия с Сервис.OnExecute когда сервис завершен при выхоже из метода.
Digitman (2003-10-31 14:01:00) [57]
> h0use
судя по описанию, транспортный поток соединения идет на завершение работы после завершения обработки тела OnExecute(), а обработчик этого события вызывается в теле метода TIdPeerThread.Run
где-то после выхода из обработчика OnExecute() соединение с клиентом автоматически разрывается, ибо логика транспортного потока завершена (штатно или по исключению в теле обработчика OnExecute() или в телах вызываемых здесь же п/программ)
итак, я дождусь от тебя наконец-то инф-ции о том, какое сообщение ты видишь ? при исполнении (31.10.03 12:15) [58] ? сколько можно резину уже тянуть ?
h0use (2003-10-31 13:46:00) [58]
Event handler for peer thread execution.
property OnExecute: TIdServerThreadEvent;
Description
OnExecute is an event handler for TIdServerThreadEvents. OnExecute occurs when a TIdPeerThread attempts to perform the TIdPeerThread.Run method. OnExecute receives AThread as a parameter, representing the TIdPeerThread thread that will be started.
Assign a TIdServerThreadEvent event handler procedure to OnExecute to respond to the event notification.
Use CommandHandlers and CommandHandlersEnabled to provide finer control over commands executed for a peer thread connection.
Digitman (2003-10-31 13:35:00) [59]
о боже ты мой !) дай мне терпения) ...
> h0use © (31.10.03 10:35) [52]
> Жирная строчка выполняется
твои слова ?
о чем это говорит, если, конечно, верить твоим словам ?
о том что метод TBAService.TCPServerDisconnect якобы действительно вызывается !
в теле этого метода - линейный алгоритм
если все тело выполнилось полностью (не важно - с правильной логикой или не правильной !), то выскочит сообщение "Success", иначе (если выполнение тела где-то привело к исключению), то выскочит сообщение "Исключение !".... Т.е. либо одно либо другое сообщение, но обязательно должно появиться !
А если ни одного не появилось, то ты лапшу мне на уши вешаешь, утверждая что (31.10.03 10:35) [52])
А теперь - к чему все это я клоню...
А клоню я к тому, что как только метод TBAService.TCPServerExecute завершит свое исполнение, то по идее сервер должен автоматически разорвать соединение с клиентом. У меня нет хэлпа под рукой, и я в этом не уверен, но у тебя-то он - перед носом !! Ты в состоянии либо сам вчитаться-вникнуть в логику события Execute либо привести это описание сюда дословно ??
h0use (2003-10-31 13:16:00) [60]
> Digitman © (31.10.03 13:07) [64]
> пойми ты, олух царя небесного, что я трачу на исследование
> твоей проблемы времени, при том что у меня нет ни исходников
> Инди ни хэлпа перед глазами !
Исходников Инди у меня самого нет, а хелп у них без примеров. Те примеры с их сайта, сами глючные до безумия.
> и я понятия не имею, в каких кодовых потоках вызываются
> обработчики тех или иных событий TCPServer"а !
При старте сервера он создает свой тред, при соединении каждого нового клиента ему создается отдельный поток в котором с ним и работает сервер.
> а ты еще упираешься) ... давным-давным бы уже дал мне детальную
> инф-цию о том, в каком код.потоке вызываются подозрительные,
> на мой взгляд, обработчики !
Могу на мыло выслать весь исходник.