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. А как сделать так, чтоб он стартовал с правами хотя бы администратора? Или вообще как сделать, чтоб клиент таки достучался до сервера в сервисе?


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]

строку чего?

Конституции острова Борнео.

Твоего исходника сервиса разумеется!


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

Наверх

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