Главная страница
    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), но все арвно клиент не может ничего отправить на сервер


 
Digitman   (2003-10-30 17:09) [41]


> h0use



> Короче, стартует вроде один раз


значит, лажовый твой "логгер"


> но все арвно клиент не может ничего отправить на сервер


а это уже все ближе и ближе ведет к неправильной логике работы непосредственно с серверным объектом

сервис, как видишь, ни при чем.


 
h0use   (2003-10-30 17:17) [42]

Кста логгер у меня тоже отрабатывает нормально, зато вот когда клиент коннектиться почему-то вместо коннекта происходит новы рестарт сервера, чего в коде нет...но логгер пишет именно это


 
Digitman   (2003-10-30 17:23) [43]


> h0use


давай так : мухи - отдельно, котлеты - отдельно

приводи код обработки коннекта клиента на стороне сервера и код ожидания и приема данных от клиента после успешного коннекта


 
h0use   (2003-10-30 17:29) [44]

Сервер:

procedure TBAService.TCPServerExecute(AThread: TIdPeerThread);
var
Client : TSimpleClient;
Msg : String;
St : String[15];
begin
If AThread.Data=nil then Exit;
Msg:= AThread.Connection.ReadLn;
If Msg="" then
begin
AThread.Connection.WriteLn("@Error:Empty String");
exit;
end;
{ Get the clients package info }
Client := Pointer(AThread.Data);
{ Check to see if the clients name has been assigned yet }
if Client.Name = "Logging In" then
begin
{ if not, assign the name and announce the client }
Client.Name := Msg;
if flBaseStat then Client.Permission:=1;
If Client.Permission<>1 then
begin
TCPServerDisconnect(AThread);
Exit;
end;
Athread.Connection.WriteLn("HELLO");
Case Client.Permission of
4: St:="Administrator";
3: St:="Developer";
2: St:="Saler"
end;
SaveLog(2,"+ User "+Client.Name+" from "+Client.DNS + " was logging in as "+St+".");
end;
end;
//--------------------------------------------------------------procedure TBAService.TCPServerDisconnect(AThread: TIdPeerThread);
var
Client : TSimpleClient;
begin
Client := Pointer(AThread.Data);
If Client=nil then Exit;
Clients.Delete(Client.ListLink);
If Client.Permission<>1 then
begin
SaveLog(2,"+ User "+Client.Name+" from "+Client.DNS + " was logging out by server.");
Athread.Connection.WriteLn("@LOGOUT:Server stopped");
end
else
begin
SaveLog(2,"- User "+Client.Name+" from "+Client.DNS + " was kicked out by server.");
SaveLog(2,"! Error: User "+Client.Name+" has no access rights.");
Athread.Connection.WriteLn("@DENY:Database not started");
end;
Client.Free;
AThread.Data := nil;
UpdateClientList;
If Clients.Count<1 then flUserConnected:=False;
end;
//--------------------------------------------------------------procedure TBAService.UpdateClientList;
var
Count : Integer;
begin
for Count := 0 to Clients.Count - 1 do
TSimpleClient(Clients.Items[Count]).ListLink := Count;
end;
//--------------------------------------------------------------procedure TBAService.TCPServerConnect(AThread: TIdPeerThread);
var
Client : TSimpleClient;
begin
Client := TSimpleClient.Create;
Client.DNS := AThread.Connection.LocalName;
Client.Name := "Logging In";
Client.ListLink := Clients.Count;
Client.Thread := AThread;
AThread.Data := Client;
Clients.Add(Client);
flUserConnected:=True;
end;


Клиент:

procedure TForm1.Button1Click(Sender: TObject);
var
Msg,S:String;
begin
TCPClient.Connect(10000);
TCPClient.WriteLn(Edit1.Text);
Msg:=TCPClient.ReadLn(); // Здесь клиент сыпется
if Msg[1]="@" then
begin
S:=UpperCase(Copy(Msg,2,Pos(":",Msg)-2));
If (S="DENY") or (S="LOGOUT") or (S="ERROR")then
begin
ShowMessage(Copy(Msg,Pos(":",Msg)+1,Length(Msg)));
Timer1.Enabled:=False;
TCPClient.Disconnect;
Exit;
end;
end;
ShowMessage(Msg);
end;


 
Digitman   (2003-10-30 17:48) [45]

завтра ... с твоего позволения ... закругляюсь на сегодня


 
h0use   (2003-10-30 17:53) [46]

Я тоже, надеюсь за вечер админы не прибьют тред. если что, то я тебе мыло отправил.


 
Digitman   (2003-10-31 08:17) [47]


if flBaseStat then Client.Permission:=1; //где инициируется flBaseStat = True ?
If Client.Permission<>1 then
begin
// здесь поставь запись в лог
TCPServerDisconnect(AThread); // сильное подозрение, что эта строчка выполняется, ибо Client.Permission = 0
Exit;
end;


а где, спрашивается, происходит присвоение Client.Permission


 
Digitman   (2003-10-31 08:21) [48]


> а где, спрашивается, происходит присвоение Client.Permission


пардон, не Client.Permission, а flBaseStat ?? ведь только при flBaseStat = True это св-во получает значение = 1 !


 
h0use   (2003-10-31 10:02) [49]

flBaseStat - Это флаг запущена БД или нет, но даже если не запущена, то запускается процесс дисконнекта, который сейчас при любом пермишине одинаков, так как клиенту полюбому отправляется сообщение, кторое он должен прочитать, но именно на чтении он и отваливается с ошибкой! Пока весь этот текст крутился в тестовой форме как приложение, все работало 100% без глюков на любом колличестве клиентов, только я это все сунул в сервис, сразу клиент перестал получать данные от сервера.


 
Digitman   (2003-10-31 10:18) [50]


> h0use


ну чего ты демагогию-то развел ? "запущена" БД, "не запущена" ... "глюки", не "глюки"..)

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

меня интересует, ВЫПОЛНЯЕТСЯ ли сторочка, выделенная жирным !
вот и будь любезен не рассуждать о странностях жизни, а отвечать на четко поставленный вопрос)


 
Digitman   (2003-10-31 10:27) [51]

туту еще одну несуразицу увидел у тебя
ты уверен, что обработчики событий TCPServerConnect/Disconnect выполняются в осн.код.потоке ? Если не уверен, то какое ты имеешь право обращаться из нескольких код.потоков одновременно к списку Clients, не защищенному ни одним объектом синхронизации ? Список-то един для всех код.потоков ! Один код.поток будет добавлять в список элемент, другой в это время удаляет элемент - что получится ? Бардак !


 
h0use   (2003-10-31 10:35) [52]

Жирная строчка выполняется...а про клиентов - это ты прав сейчас бардак, просто я не знаю как синхронизировать. Поэтому периодически вываливается эксепшен.


 
Digitman   (2003-10-31 11:06) [53]

так ... понятно ...

поехали дальше


procedure TBAService.TCPServerDisconnect(...);
begin
try
.. сюда добавь все что у тебя там есть в теле обработчика этого события
except
on E: Exception do
... здесь пиши в лог e.Classname + e.Message ..
end
end;


о результатах записи в лог сообщи


 
h0use   (2003-10-31 11:26) [54]

У меня такое подозрение, что у меня запись в лог не работает, потому как кроме системных сообщений об успешном старте или остановке, других сообщений нет


 
h0use   (2003-10-31 11:31) [55]

Ха..поставил showmessage везде, так блин в сервисе даже TCPServerExecute не запускается


 
Reindeer Moss Eater   (2003-10-31 11:35) [56]

unit LogUnit;

interface

procedure Log(const AMsg:string; const AParam:string = "");

implementation

uses SysUtils;

var LogName:string;

procedure Log(const AMsg : string; const AParam : string = "");
var F:Text;
begin
Assign(F,LogName);
try
if FileExists(LogName) then Append(F) else Rewrite(F);
Writeln(F,FormatDateTime("dd.mm.yyyy hh:mm:ss",Now),#9,AMsg,#9,AParam);
finally
Close(F);
end;
end;

initialization
LogName:=ChangeFileExt(ParamStr(0),".log");
end.


 
Reindeer Moss Eater   (2003-10-31 11:36) [57]

Только не помешает добавить потокобезопастность.


 
Digitman   (2003-10-31 12:15) [58]


> h0use


> Ха..поставил showmessage везде


недопустимо !!!

я же тебе сказал - либо штатный метод TServer.LogMessage() либо MessageBox() вызывай в контрольных точках ! Что непонятного ?

еще раз на огрурцах показываю :


procedure TBAService.TCPServerDisconnect(...);
begin
try
.. сюда добавь все что у тебя там есть в теле обработчика этого события

MessageBox(0, "", "Success", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);

except
on E: Exception do
MessageBox(0, "Исключение !", PChar(e.ClassName + " " + e.Message), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
end
end;



 
h0use   (2003-10-31 12:28) [59]

Да нет, не то, showmessage то как раз работает, и для отладки нормально, другое дело, что сами процедуры не работают, хотя клиент коннект видит...но сообщения не получает и не отправляет.


 
Reindeer Moss Eater   (2003-10-31 12:42) [60]

Не, не, к терапевту ....


 
h0use   (2003-10-31 12:47) [61]

Да не к терапевту, просто зачем огород городить с messagebox или вообще новый юнит писать, если работает то что тработает. Я понимаю, что не хорошо класть showmessage, но пока это не сказывается на работоспособности его мне легче ставить в критические места (меньше писанины)


 
Digitman   (2003-10-31 12:52) [62]


> h0use


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

ты хоть что-нибудь слышал о потоконезащищенности VCL ?


 
Digitman   (2003-10-31 12:57) [63]


> h0use


мы тут чем занимаемся вообще ? ищем твои ляпы или плодим новые ошибки в твоей программе ?

еще ракз тебе повторяю - НЕДОПУСТИМО вызывать ShowMessage() в доп.код.потоке !!!!

делай как тебе говорят !!!


 
Digitman   (2003-10-31 13:07) [64]


> h0use


пойми ты, олух царя небесного, что я трачу на исследование твоей проблемы времени, при том что у меня нет ни исходников Инди ни хэлпа перед глазами !

и я понятия не имею, в каких кодовых потоках вызываются обработчики тех или иных событий TCPServer"а !

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


 
h0use   (2003-10-31 13:11) [65]

Сдела как сказали...ничего не изменилось, сообщений не появилось, т.е. как я и предполагал в процедуры соединения Indy сервер не заходит, хотя сокет открывает.


 
h0use   (2003-10-31 13:16) [66]


> Digitman © (31.10.03 13:07) [64]
> пойми ты, олух царя небесного, что я трачу на исследование
> твоей проблемы времени, при том что у меня нет ни исходников
> Инди ни хэлпа перед глазами !


Исходников Инди у меня самого нет, а хелп у них без примеров. Те примеры с их сайта, сами глючные до безумия.


> и я понятия не имею, в каких кодовых потоках вызываются
> обработчики тех или иных событий TCPServer"а !


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


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


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


 
Digitman   (2003-10-31 13:35) [67]

о боже ты мой !) дай мне терпения) ...


> h0use © (31.10.03 10:35) [52]
> Жирная строчка выполняется


твои слова ?
о чем это говорит, если, конечно, верить твоим словам ?
о том что метод TBAService.TCPServerDisconnect якобы действительно вызывается !

в теле этого метода - линейный алгоритм
если все тело выполнилось полностью (не важно - с правильной логикой или не правильной !), то выскочит сообщение "Success", иначе (если выполнение тела где-то привело к исключению), то выскочит сообщение "Исключение !".... Т.е. либо одно либо другое сообщение, но обязательно должно появиться !
А если ни одного не появилось, то ты лапшу мне на уши вешаешь, утверждая что (31.10.03 10:35) [52])

А теперь - к чему все это я клоню...
А клоню я к тому, что как только метод TBAService.TCPServerExecute завершит свое исполнение, то по идее сервер должен автоматически разорвать соединение с клиентом. У меня нет хэлпа под рукой, и я в этом не уверен, но у тебя-то он - перед носом !! Ты в состоянии либо сам вчитаться-вникнуть в логику события Execute либо привести это описание сюда дословно ??


 
h0use   (2003-10-31 13:46) [68]

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 14:01) [69]


> h0use


судя по описанию, транспортный поток соединения идет на завершение работы после завершения обработки тела OnExecute(), а обработчик этого события вызывается в теле метода TIdPeerThread.Run

где-то после выхода из обработчика OnExecute() соединение с клиентом автоматически разрывается, ибо логика транспортного потока завершена (штатно или по исключению в теле обработчика OnExecute() или в телах вызываемых здесь же п/программ)

итак, я дождусь от тебя наконец-то инф-ции о том, какое сообщение ты видишь ? при исполнении (31.10.03 12:15) [58] ? сколько можно резину уже тянуть ?


 
Reindeer Moss Eater   (2003-10-31 14:05) [70]

А клоню я к тому, что как только метод TBAService.TCPServerExecute завершит свое исполнение, то по идее сервер должен автоматически разорвать соединение с клиентом.

Там иная логика.
С толку сбивает напрашивающаяся аналогия с Сервис.OnExecute когда сервис завершен при выхоже из метода.


 
h0use   (2003-10-31 14:06) [71]

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


 
Reindeer Moss Eater   (2003-10-31 14:07) [72]

Digitman
Оставь ты человека.
От тебе незнакомые слова и комбинации таких слов из своего проекта кидает и это ему нравится.


 
h0use   (2003-10-31 14:09) [73]


> Там иная логика.
> С толку сбивает напрашивающаяся аналогия с Сервис.OnExecute
> когда сервис завершен при выхоже из метода.


Если уж на то пошло то там логика как у TThread.execute и когда все это работало не в сервисе то поток сервера прерывался только когда его терминировали (либо ручками либо при "отвале" клиента), и это при всем при том, что OnExecute отрабатывал еще только при логине.


 
Reindeer Moss Eater   (2003-10-31 14:17) [74]

Вот только не надо мне объяснять какая там логика.
Сначала разберись со своим проектом.


 
Digitman   (2003-10-31 14:24) [75]


> Reindeer Moss Eater © (31.10.03 14:05) [70]


> Там иная логика.


я не спорю. может быть и так.
есть еще один вариант - OnExecute вызывается всякий раз когда буфер приема гнезда не пуст

внеси ясность, если код под рукой
внеси так же ясность в реакцию TIdPeerThread на необработанное в теле OnExecute() исключение... код в том виде, в котором он приведен у автора, просто безобразен - нет ни одного блока обработки исключений

факт в том что автор в обработчике OnExecute() ЯВНО вызывает метод OnDisconnect(), это видно из кода, и автор утверждает, что вызов действительно происходит ! но там я, как видишь, расставил ловушки, обойти которые невозможно - хотя бы одна да сработает !

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


 
Reindeer Moss Eater   (2003-10-31 14:28) [76]

есть еще один вариант - OnExecute вызывается всякий раз когда буфер приема гнезда не пуст

Именно так.
Вот типичный код OnExecute

procedure SomeIndyServerOnExecute(AThread:TidPeerThread);
begin
GlobalStringVar:= GlobalStringVar + Athread.Connection.ReadChar;
if GlobalStringVar = "Пора меня отключать нафик" then AThread.Connection.Disconnect;
end;

Прекращения соединения с клиентом не происходит при выходе из обработчика (если самому не закрыть соединения).


 
h0use   (2003-10-31 14:39) [77]

Господа, я конечно все понимаю, что я туп и глуп, НО я поставил ловушку в самом начале метода OnExecute, и она тоже не сработала! Т.е. В этот метод вообще при коннекте не поадаем. Но когда я весь код один в один перенес в обычную апликацию, все сразу заработало. Можно считать меня тупым, но я не буду начинать писать непонятный для меня сервис, если у меня не отлажена обработка соединения. Так вот, все процедуры приведенные мной работают безошибочно если они работают в обычном приложении, а не в сервисе. Собственно поэтому я и создал тред.


 
Reindeer Moss Eater   (2003-10-31 14:45) [78]

Объясняю твое заблуждение насчет Copy & Paste кода.

Код можно перенести один в один. Но можно забыть перенести таким же методом компонент сервера, от свойств которого работоспособность зависит не меньше чем от кода.

Например:

В gui приложении у сервера не определены CommandHandlers, а в сервисном приложении они есть.
Можно хоть запереноситься кодом туда и обратно, но в сервисном приложении событие OnExecute не возникнет вообще.
И сервис тут совсем ни пришей ни пристегни. Виноваты созданные коммандхендлерс у компонента сервера.


 
Digitman   (2003-10-31 14:52) [79]


> 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;


 
Digitman   (2003-10-31 14:58) [80]

кто-то из вас точно лапшу вешает)

>Жирная строчка выполняется

не мое утверждение - автора !

а выполняется она, будучи вызванная из обработчика OnExecute()

а обработчик OnExecute(), согласно последним "веяниям", не вызывается)))))

лыко-мочало, поехали сначала)

клоунада))


 
Reindeer Moss Eater   (2003-10-31 14:59) [81]

Я же про обработчик OnExecute, а не про метод Execute треда


 
h0use   (2003-10-31 15:04) [82]


> а обработчик OnExecute(), согласно последним "веяниям",
> не вызывается)))))

Последние "веяниия" реальны...выполнялась она только когда я в аплекухе отлаживал, сейча до нее даже не доходит. OnExecute не выполняется вообще!


 
Digitman   (2003-10-31 15:07) [83]


> Reindeer Moss Eater


и я - про него !
про обработчик TidTCPServer.OnExecute !

при чем здесь TService.OnExecute и CommandHandlers ?

это уже давно проехали - событие TService.OnExecute он якобы, по моему настоянию, не назначает и не обрабатывает никак, TCPServer он стартует в TService.OnStart, останавливает в TService.OnStop

все просто д.б. как божий день - никакие TService.OnExecute нас не волнуют вообще


 
Digitman   (2003-10-31 15:09) [84]


> h0use


ну хорошо, предположим что не выполняется
какого ж ... тогда ты мне мозги паришь, что

> Жирная строчка выполняется

??


 
h0use   (2003-10-31 15:14) [85]

Дая просто вчера не ту апликацию запускал, я тут урывками софт пишу от основной работы, вот и путаю иногда, а сегодня вот посвободней и я точные данные выдаю. А они описаны в [82]


 
Digitman   (2003-10-31 15:25) [86]

так...

TBAService.TCPServerConnect у тебя вызывается ?

если - да, ищи там исключение.

если оно там происходит, то до OnExecute, разумеется, дело не дойдет !

вот и весь фокус


 
Reindeer Moss Eater   (2003-10-31 15:27) [87]

и я - про него !
про обработчик TidTCPServer.OnExecute !


Все, что я говорил, было:

Когда завершается TidTCPServer.OnExecute (когда завершается обработчик) TCP сервер не рвет коннект.


 
h0use   (2003-10-31 15:29) [88]

TBAService.TCPServerConnect , аналогично даже не входит в процедуру! Я уж не говорю об отсутствии ексепшинов и сакцессов.


 
Digitman   (2003-10-31 15:35) [89]


> Reindeer Moss Eater


ладно, дальше все ясно


> h0use ©


последние штрихи к "портрету твоего кода" :

после коннекта транспортный тред не будет задействован (и, соответственно, ты не получишь ни одно из событий OnConnect/OnExecute/OnDisconnect), если ты напортачил со св-вом Intercept. При возникновении там исключения никакого трансп.потока и никаких событий ты не получишь, и коннект будет тут же автоматом разорван сервером, что и наблюдается.

Вот тебе и вся сказка твоя.

А ты - "сервис, сервис" !!


 
h0use   (2003-10-31 15:46) [90]

Я Intercept не трогал, я пытался, но не копилится, поэтому у меня этот код убран вообще!


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

не знаю уж, что ты там "трогал" или не "трогал", но - вот ориг.код :


procedure TIdListenerThread.Run;
var
Peer: TIdTCPServerConnection;
Thread: TIdPeerThread;
i : Integer;
begin
FBindingList.Clear;
for i:= 0 to Server.Bindings.Count - 1 do begin
FBindingList.Add(TObject(Server.Bindings[i].Handle));
end;
if GStack.WSSelect(FBindingList, nil, nil, AcceptWait) > 0 then begin
if not Terminated then begin
for i := 0 to FBindingList.Count - 1 do begin
Peer := TIdTCPServerConnection.Create(Server);
with Peer do begin
Binding.Accept(TIdStackSocketHandle(FBindingList[i])); // в этот момент твой клиент получает OnConnect-событие
// LastRcvTimeStamp := Now; // Added for session timeout support
// ProcessingTimeout := False;
if Assigned(Server.Intercept) then begin
try
Peer.Intercept := Server.Intercept.Accept(Binding);
Peer.InterceptEnabled := True;
except
FreeAndNil(Peer); // а в этот твой клиент вываливается, ибо здесь закрывается соединение с ним
end;
end;
end;
if Peer <> nil then begin //после чего эта строчка не выполняется, поток не стартует, и , соотв-но, никаких событий ты не видишь на сервере
// Create Thread
Thread := TIdPeerThread(Server.ThreadMgr.GetThread);
Thread.FConnection := Peer;
Server.Threads.Add(Thread);
Thread.Start;
end;
end;
end;
end;
end;


ты скажи лучше, почему ты OnException не обрабатываешь на сервере ?

для Пушкина что ль событие это ? для тебя !!! что бы ты в сомнительных ситуациях видел, что в ходе работы сервера привело к исключительной ситтуации !!


 
Digitman   (2003-10-31 16:02) [92]


> Я Intercept не трогал, я пытался, но не копилится, поэтому
> у меня этот код убран вообще


уже не верю ничему, после того как ты детский лепет тут развел с "жирной строкой" - то тот исходник, то не тот ... в бирюльки чтоль играешься ?


 
h0use   (2003-10-31 16:07) [93]

Вот как у меня сейчас:

procedure TBAService.TCPServerExecute(AThread: TIdPeerThread);
var
Client : TSimpleClient;
Msg : String;
St : String[15];
begin
MessageBox(0, "", "TCPServerExecute", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
If AThread.Data=nil then Exit;
Msg:= AThread.Connection.ReadLn;
MessageBox(0, "",PChar( "New text "+Msg), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
If Msg="" then
begin
AThread.Connection.WriteLn("@Error:Empty String");
exit;
end;
{ Get the clients package info }
Client := Pointer(AThread.Data);
{ Check to see if the clients name has been assigned yet }
if Client.Name = "Logging In" then
begin
{ if not, assign the name and announce the client }
MessageBox(0, "", "New Client", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
Client.Name := Msg;
if flBaseStat then Client.Permission:=1;
If Client.Permission<>1 then
begin
MessageBox(0, "", "Disconnect", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
TCPServerDisconnect(AThread);
Exit;
end;
Athread.Connection.WriteLn("HELLO");
Case Client.Permission of
4: St:="Administrator";
3: St:="Developer";
2: St:="Saler"
end;
SaveLog(2,"+ User "+Client.Name+" from "+Client.DNS + " was logging in as "+St+".");
end;
end;
//------------------------------------------------------------------------------
procedure TBAService.TCPServerDisconnect(AThread: TIdPeerThread);
var
Client : TSimpleClient;
begin
try
Client := Pointer(AThread.Data);
If Client=nil then Exit;
Clients.Delete(Client.ListLink);
If Client.Permission<>1 then
begin
SaveLog(2,"+ User "+Client.Name+" from "+Client.DNS + " was logging out by server.");
Athread.Connection.WriteLn("@LOGOUT:Server stopped");
end
else
begin
SaveLog(2,"- User "+Client.Name+" from "+Client.DNS + " was kicked out by server.");
SaveLog(2,"! Error: User "+Client.Name+" has no access rights.");
Athread.Connection.WriteLn("@DENY:Database not started");
end;
Client.Free;
AThread.Data := nil;
UpdateClientList;
MessageBox(0, "", "Success", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
If Clients.Count<1 then flUserConnected:=False;
except
on E: Exception do
begin
SaveLog(2,"! Error: "+e.Classname + " " + e.Message);
MessageBox(0, "


 
Digitman   (2003-10-31 16:12) [94]

я ему про фому, он мне все про ерему таддычит)))

что ты снова тычешь свой код ?
не выполняется же он ! ни одно событие ! выяснили же ...
или уже с какого-то перепугу события начали возбуждаться ?

тебе последний раз говорю - ГДЕ У ТЕБЯ ОБРАБОТКА OnException() ?

все, больше тянуть из тебя не намерен, у меня своей работы полно, еще няньчиться с тобой


 
h0use   (2003-10-31 16:16) [95]


> ты скажи лучше, почему ты OnException не обрабатываешь на
> сервере ?

Да потому что он не вызывается, только что поставил обработчик...пусто...как будто и не ставил.


 
Reindeer Moss Eater   (2003-10-31 16:24) [96]

Через пару дней выяснится, что вообще
TCPServer.Active = False


 
Digitman   (2003-10-31 16:27) [97]

чему равно и как явно используется св-во ThreadMgr ?


 
h0use   (2003-10-31 16:31) [98]


ThreadMgr: TIdThreadMgrDefault;

TCPServer.ThreadMgr:=ThreadMgr;


 
Digitman   (2003-10-31 16:33) [99]


> Reindeer Moss Eater


все может быть)
хотя автор упорно продолжает утверждать , что событие Клиент.OnConnect возбуждается)

еще двух таких дней я не вынесу) ... прямая дорога на погост)

ну не хочет думать человек !

давно бы уж, б.., исходники нашел и оттрассировал бы логику потрохов Инди ! вкупе со своей приклеенной)

я ж вот не поленился кучу времени потратить на него и даже исх-ки скачать(


 
Digitman   (2003-10-31 16:38) [100]


> h0use © (31.10.03 16:31) [98]
>
> ThreadMgr: TIdThreadMgrDefault;
>
> TCPServer.ThreadMgr:=ThreadMgr;


эт чего ? это где ?


 
Digitman   (2003-10-31 16:43) [101]

давай сюда тела обработчиков TService

OnStart
OnExecute
OnStop


 
h0use   (2003-10-31 16:58) [102]


procedure TBAService.ServiceStart(Sender: TService; var Started: Boolean);
begin
flServerStat := False;
flBaseStat := False;
flViewLaunch := False;
flHasChanges := False;
flUserConnected := False;
flByName := True;
flAutostart := False;
flAutoSelectLast:= True;
flLogNet := True;
flShowIcon := True;
flAllreadyShow := False;
// if not assigned (CS) then CS := TCriticalSection.Create;
StartLogging;
If not LoadFromReg then LoadDefaults;
if flAutoStart then
if ServerStart and BaseStart then SaveLog(1, "+ Successefully started.")
else SaveLog(1, "- Started with any errors.");

Started := True;
MessageBox(0, "", PChar("Service started "+BoolToStr(Started)), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
end;
//------------------------------------------------------------------------------
procedure TBAService.ServiceStop(Sender: TService; var Stopped: Boolean);
var
f1,f2:Boolean;
begin
f1:=True;f2:=True;
if flBaseStat then f2:=BaseStop;
if flServerStat then f1:=ServerStop;
If f1 and f2 then SaveLog(1, "+ Successefully stopped.")
else SaveLog(1, "- Stopped with any errors.");
StopLogging;
// if assigned(CS) then FreeAndNil(CS);
// ServiceThread.Terminate;
Stopped := True;
end;
//------------------------------------------------------------------------------
procedure TBAService.ServiceContinue(Sender: TService;
var Continued: Boolean);
var
f1,f2:Boolean;
begin
f1:=True;f2:=True;
if not flServerStat then f1:=ServerStart;
if not flBaseStat then f2:=BaseStart;
If f1 and f2 then SaveLog(1, "+ Successefully restarted.")
else SaveLog(1, "- Restarted with any errors.")
end;
//------------------------------------------------------------------------------
procedure TBAService.ServicePause(Sender: TService; var Paused: Boolean);
var
f1:Boolean;
begin
try
f1:=True;
if flServerStat then f1:=ServerStop;
If f1 then SaveLog(1, "+ Successefully paused.")
else SaveLog(1, "- Paused with any errors.");
Paused:=True;
except
end;
end;
//------------------------------------------------------------------------------
procedure TBAService.ServiceShutdown(Sender: TService);
begin
// ServiceStop(Sender,True);

end;

procedure TBAService.ServiceExecute(Sender: TService);
begin
Stream := TMemoryStream.Create;
try

while not Terminated do
begin
ServiceThread.ProcessRequests(True);
Sleep(10);
end;
finally
Stream.Free;
end;
end;


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


> Digitman © (31.10.03 16:38) [100]
>
> > h0use © (31.10.03 16:31) [98]
> >
> > ThreadMgr: TIdThreadMgrDefault;
> >
> > TCPServer.ThreadMgr:=ThreadMgr;
>
>
> эт чего ? это где ?


Это ответ на вопрос [97]


 
Digitman   (2003-10-31 17:10) [104]

тела ф-ций, упомянутых в

if ServerStart and BaseStart then ...

на хирург.стол !!


 
h0use   (2003-10-31 17:12) [105]


function TBAService.ServerStart:Boolean;
var
Binding : TIdSocketHandle;
begin
TCPServer:=TIdTCPServer.Create(Self);
AntiFreeze:=TIdAntiFreeze.Create(Self);
MessageBox(0, "", "Server create", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
AntiFreeze.Active:=True;
TCPServer.Bindings.Clear;
try
TCPServer.DefaultPort:=StrToInt(ServerPort);
If flByName then
begin
Binding:=TCPServer.Bindings.Add;
Binding.Port:=StrToInt(ServerPort);
end
else
begin
Binding:=TCPServer.Bindings.Add;
Binding.IP:=ServerIP;
Binding.Port:=StrToInt(ServerPort);
end;
TCPServer.Active:=True;
SaveLog(2,"+ Server is started.");
MessageBox(0, "", "Server is started.", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
flServerStat:=True;
If flLogNet then
begin
// TCPServer.Intercept.Init:= NetLogEvent;
NetLogEvent.Active:=True;
end
else
begin
NetLogEvent.Active:=False;
// TCPServer.Intercept:=nil;
end;
Clients:=TList.Create;
Result:=True;
except
on E : Exception do
begin
SaveLog(2,"- Server isn""t started.");
MessageBox(0, "Исключение !", PChar("Server isn""t started."), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
SaveLog(2,"! Error: "+E.Message);
Result:=False;
end;
end;
end;
//------------------------------------------------------------------------------
function TBAService.BaseStart:Boolean;
begin
try
BADBCon:=TADOConnection.Create(Self);
BADBCon.Connected:=True;
SaveLog(4,"+ Database is started.");
Result:=True;
except
on E : Exception do
begin
SaveLog(4,"- Database is""nt started.");
SaveLog(4,"! Error: "+E.Message);
Result:=False;
end;
end;
end;
//------------------------------------------------------------------------------
function TBAService.ServerStop:Boolean;
begin
Result:=True;
try
FreeAndNil(AntiFreeze);
FreeAndNil(NetLogEvent);
FreeAndNil(TCPServer);
FreeAndNil(Clients);
flServerStat:=False;
SaveLog(2, "+ Server is stopped.");
except
on E : Exception do
begin
SaveLog(2,"- Server isn""t stopped.");
SaveLog(2,"! Error: "+E.Message);
Result:=False;
end;
end;
end;
//------------------------------------------------------------------------------
function TBAService.BaseStop:Boolean;
begin
try
BADBCon.Connected:=False;
FreeAndNil(BADBCon);
SaveLog(4,"+ Database is stopped.");
Result:=True;
except
on E : Exception do
begin
SaveLog(4,"- Database is""nt stopped.");
SaveLog(4,"! Error: "+E.Message);
Result:=False;
end;
end;
end;


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

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

Started := True;

???

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


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


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

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


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

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


> AntiFreeze:=TIdAntiFreeze.Create(Self);


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


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


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

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


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


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

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

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

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


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

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


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


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


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


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

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


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


> 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.


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


> If calls are made in the main thread


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

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

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


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

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


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

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


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

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


 
Digitman   (2003-11-01 11:56) [118]

значит, так : выкидывай все что ты там понаворочал, кроме обработчиков событий 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-11-04 10:29) [119]

Спасибо за оптимизацию моего бреда, тперь програма перешла в новый статус - клиент при попытке законнектится пишет "#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."


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

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


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

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


 
Digitman   (2003-11-04 11:57) [122]


> h0use


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


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


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

>> только OnStart и OnStop

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

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

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


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

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


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


> "#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 13:11) [125]

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



Страницы: 1 2 3 4 вся ветка

Форум: "Система";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.82 MB
Время: 0.021 c
1-49564
Gnom
2004-01-05 23:14
2004.01.16
Записать в файл


3-49426
VicSel
2003-12-17 20:10
2004.01.16
Упаковка таблицы dbf


4-49814
Tommy
2003-11-12 14:31
2004.01.16
vizov DLL...


14-49747
Denis
2003-12-24 16:49
2004.01.16
Как определить номер недели в году?


1-49576
Lt
2004-01-05 09:00
2004.01.16
Переменные и TEdit





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