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-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"а !


При старте сервера он создает свой тред, при соединении каждого нового клиента ему создается отдельный поток в котором с ним и работает сервер.


> а ты еще упираешься) ... давным-давным бы уже дал мне детальную
> инф-цию о том, в каком код.потоке вызываются подозрительные,
> на мой взгляд, обработчики !


Могу на мыло выслать весь исходник.


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

Наверх

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