![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
h0use © (2003-10-30 12:28:00)
Уважаемые мастера,
есть проблема, используется компонета indy idTCPServer отладил на обыкновенной аппликации процес соединения и передачи данных клиенту, затем перенес этот код в Сервис. НО, теперь клиент не может достучаться до сервера. Видимо теперь сервер стартует с правами System. А как сделать так, чтоб он стартовал с правами хотя бы администратора? Или вообще как сделать, чтоб клиент таки достучался до сервера в сервисе?
Digitman (2003-10-30 17:48:00) [81]
завтра ... с твоего позволения ... закругляюсь на сегодня
h0use (2003-10-30 17:29:00) [82]
Сервер:
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:23:00) [83]
> h0use
давай так : мухи - отдельно, котлеты - отдельно
приводи код обработки коннекта клиента на стороне сервера и код ожидания и приема данных от клиента после успешного коннекта
h0use (2003-10-30 17:17:00) [84]
Кста логгер у меня тоже отрабатывает нормально, зато вот когда клиент коннектиться почему-то вместо коннекта происходит новы рестарт сервера, чего в коде нет...но логгер пишет именно это
Digitman (2003-10-30 17:09:00) [85]
> h0use
> Короче, стартует вроде один раз
значит, лажовый твой "логгер"
> но все арвно клиент не может ничего отправить на сервер
а это уже все ближе и ближе ведет к неправильной логике работы непосредственно с серверным объектом
сервис, как видишь, ни при чем.
h0use (2003-10-30 16:57:00) [86]
Короче, стартует вроде один раз, создаю все объекты при старте как create(self), но все арвно клиент не может ничего отправить на сервер
Digitman (2003-10-30 16:40:00) [87]
> А с того что у меня внутренний логгер работает
в событии OnStart() он работает ?
а чем хуже логгера банальнейший MessageBox() ? уж куда проще) ... с логгером ты вполне мог и намудрить, а уж если MessageBox(0, "Заголовок", "Сообщение", mb_ok) выполнится, то тут уж от факта никуда не отвертишься : сколько раз появится диал.окно, столько раз и OnStart() было вызвано ...
ну и LogMessage() ничем не хуже, кстати ... и даже корректней/безопасней во многих случаях ...
h0use (2003-10-30 16:28:00) [88]
> с чего ты взял тогда, что OnStart() многократно вызывается
> ?
А с того что у меня внутренний логгер работает, он и показывает что дважды запускается...блин я бы сунул бы сюда код сервиса, да только размер сообщения не позволяет, очень сложно говрить когда уже куча процедур и функций наваяно, может где-то в другом месте бага...
Digitman (2003-10-30 16:11:00) [89]
> Только то что сервис успешно загружен и запущен
с чего ты взял тогда, что 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 15:51:00) [90]
В 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 15:37:00) [91]
> Только я не могу понять куда он это записывает
сказал же тебе - открой консоль Events в Administrative Tools, там все и увидишь
> По идее сендер у меня Сервис
что значит "по идее" ? ты это проверил ?
h0use (2003-10-30 15:29:00) [92]
> Digitman © (30.10.03 15:15) [32]
> где ? где ты увидел Sender"а в том что ты привел только
> что ??
По идее сендер у меня Сервис
h0use (2003-10-30 15:21:00) [93]
> Reindeer Moss Eater © (30.10.03 14:59) [27]
> Ты в [23] все буквы прочитал?
> Чему равно Started в OnStart?
Я телаю вот так:
Started := True;
LogMessage(BoolToStr(Started));
Только я не могу понять куда он это записывает
Digitman (2003-10-30 15:15:00) [94]
> h0use
> Сейчас у меня вот так
> TCPServer:=TIdTCPServer.Create(nil);
бросил бы ты пока сервисами заниматься) ... таки действительно не самое простое дело)
а у тебя - пробелы в элементарных знаниях, не имеющих никакого отношения к сервисам !
где ? где ты увидел Sender"а в том что ты привел только что ??
Reindeer Moss Eater (2003-10-30 15:09:00) [95]
Мда...
h0use (2003-10-30 15:08:00) [96]
> Digitman © (30.10.03 15:00) [28]
>
> > h0use © (30.10.03 14:45) [24]
>
> быть того не может.
> это объект-источник события (в дан.случае - конкретный объект-наследник
> класса TService). Спрашивается, КТО возбудил событие, если
> Sender = nil ? С какого перепугу он будет = nil, если это
Сейчас у меня вот так
TCPServer:=TIdTCPServer.Create(nil);
Digitman (2003-10-30 15:03:00) [97]
> А сервис стартует все арвно два раза...
ну ты в протоколе-то (консоль Events) посмотри в конце-концом, что сервис-менеджер системный говорит по этому поводу !!
Digitman (2003-10-30 15:00:00) [98]
> h0use © (30.10.03 14:45) [24]
> Sender вообще у меня nil
быть того не может.
это объект-источник события (в дан.случае - конкретный объект-наследник класса TService). Спрашивается, КТО возбудил событие, если Sender = nil ? С какого перепугу он будет = nil, если это факт.параметр формируется не тобой, а объектом TServiceThread, однозначно ассоциированным с конкретным экз-ром объекта-сервиса ?
> где в свойствах сервиса фигурирует выше приведенный алгоритм?
открой консоль Services, найди там свой сервис, вызови его Свойства, в свойствах есть закладка Recovery - вот там и смотри установки текущие для данного сервиса
Reindeer Moss Eater (2003-10-30 14:59:00) [99]
Ты в [23] все буквы прочитал?
Чему равно Started в OnStart?
h0use (2003-10-30 14:55:00) [100]
Если вы имеете ввиду Recovery закладку, то там у меня все выключено. А сервис стартует все арвно два раза...