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


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 закладку, то там у меня все выключено. А сервис стартует все арвно два раза...


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

Наверх

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