Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.20;
Скачать: CL | DM;

Вниз

Service написал и вставил ServerSocket - не откликается....   Найти похожие ветки 

 
wbc ©   (2002-12-26 16:45) [0]

Сабж, однако обработкик OnRead и т.п. не работает. Ошибок не выдает. Слушает порт. Клиент коннектится и говорит все ок, сообщение посылает и т.д. Скорее всего сообщение приходит не туда где я его обрабатываю, но куда? Могу выслать исходники по е-mail (40k). PS. Service на WinAPI.


 
Digitman ©   (2002-12-26 17:11) [1]

SocketServer.ServerType = stThreadBlocking ? или stNonBlocking ?


 
wbc ©   (2002-12-26 17:27) [2]

И так и сяк пробовал.


 
wbc ©   (2002-12-26 17:30) [3]

Вот клас с обработчиками:
TEvents=class
procedure Receive(Sender: TObject; Socket: TCustomWinSocket);
procedure Connect(Sender: TObject; Socket: TCustomWinSocket);
procedure disconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure test;
end;
procedure Log(ErStr: String);

implementation

Procedure WriteToLog(Str: String);
var
f,ftmp : System.TextFile;
x: String;
begin
AssignFile(f,"c:\swinapi.log");
AssignFile(ftmp,"c:\swinapi.tmp");
Reset(f);
if IOResult=0 then
begin
Rewrite(ftmp);
while not SeekEof(f) do
begin
ReadLn(f,x);
WriteLn(ftmp,x);
end;
CloseFile(f);
Erase(f);
end
else
Rewrite(ftmp);
Writeln(ftmp,Str);
CloseFile(ftmp);
Rename(ftmp,"c:\swinapi.log");
end;

procedure Log(ErStr: String);
begin
WriteToLog(ErStr);
end;
. . .
procedure TEvents.Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Log("new client at...");
end;
. . .


 
wbc ©   (2002-12-26 17:32) [4]

Это основная проц. сервиса:
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var
Status : DWORD;
ServerSocket: TServerSocket;
begin
ServiceStatus.dwServiceType := SERVICE_WIN32;
ServiceStatus.dwCurrentState := SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted := SERVICE_ACCEPT_STOP
or SERVICE_ACCEPT_PAUSE_CONTINUE;
ServiceStatus.dwWin32ExitCode := 0;
ServiceStatus.dwServiceSpecificExitCode := 0;
ServiceStatus.dwCheckPoint := 0;
ServiceStatus.dwWaitHint := 0;

ServiceStatusHandle :=
RegisterServiceCtrlHandler(ServiceName,@ServiceCtrlHandler);
if ServiceStatusHandle = 0 then WriteLn("RegisterServiceCtrlHandler Error");


ServiceStatus.dwCurrentState :=SERVICE_RUNNING;
ServiceStatus.dwCheckPoint :=0;
ServiceStatus.dwWaitHint :=0;

if not SetServiceStatus (ServiceStatusHandle,ServiceStatus)
then begin
Status:=GetLastError;
Log("SetServiceStatus 3: "+String(Status));
exit;
end;

ServerSocket:=TServerSocket.Create(nil);
Log("1..");
with ServerSocket do begin
ServerType:= stThreadBlocking;
Port:= 4096;
OnClientRead:=Events.Receive;
OnClientConnect:= Events.Connect;
OnClientDisconnect:= Events.Disconnect;
OnClientError:= Events.Error;
Open;
if Active=true then
Log("ServerSocket is ACTIVE")
else
Log("ServerSocket is failed");
end;
repeat
if ServiceStatus.dwCurrentState <> SERVICE_PAUSED
then begin Sleep(500); end;
until ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServerSocket.Close;
ServerSocket.Free;
end;


 
wbc ©   (2002-12-26 17:33) [5]

Это основная проц. сервиса:
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
begin
. . .
ServerSocket:=TServerSocket.Create(nil);
Log("1..");
with ServerSocket do begin
ServerType:= stThreadBlocking;
Port:= 4096;
OnClientRead:=Events.Receive;
OnClientConnect:= Events.Connect;
OnClientDisconnect:= Events.Disconnect;
OnClientError:= Events.Error;
Open;
if Active=true then
Log("ServerSocket is ACTIVE")
else
Log("ServerSocket is failed");
end;
repeat
if ServiceStatus.dwCurrentState <> SERVICE_PAUSED
then begin Sleep(500); end;
until ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServerSocket.Close;
ServerSocket.Free;
end;


 
Digitman ©   (2002-12-27 08:23) [6]

А где у тебя создается экземпляр класса TEvents ? Что-то не вижу.

P.S.
И в чем прелесть писать код сервиса на API, если на то есть достаточно удобные стандартные классы TService и TServiceApplication ? На чем ты тут сэкономишь ? Imho, ни на чем. Вся твоя "экономия" сводится на нет из-за использования в модуле scktcomp.pas (где реализован TServerSocket) модуля Forms.
Писал бы уж тогда и код socket-сервера на API)..


 
wbc ©   (2002-12-27 09:48) [7]

. . .
Events:=TEvents.Create;
ServerSocket:=TServerSocket.Create(nil);
. . .
ServerSocket.Free;
Events.Free;

Все равно не работает :(

>>На чем ты тут сэкономишь ?
Правда. Сервис был у меня написан на TService, я постепенно его перевожу на WinAPI - жрет много оперативки.
>>Писал бы уж тогда и код socket-сервера на API)..
Для начала хочу чтобы так заработал, а то с наскока может не получиться...


 
wbc ©   (2002-12-27 09:56) [8]

После нажатия кнопки Stop в м.сервисов он выдал в log он выдал "stopped" (ка всегда) и "disconnect" - а вот этого раньше не было! Правда, дисконектился я клиентом минут 10 уже как и не раз... Что тут может быть?


 
Digitman ©   (2002-12-27 13:55) [9]


> Сервис был у меня написан на TService, я постепенно
> его перевожу на WinAPI - жрет много оперативки.


А когда сервис на TService был написан, все работало ?
Ты вообще представляешь себе отличия в блок. и неблок. режиме TServerSocket ? Ты понимаешь, и в том и в другом случае TServerSocket генерирует и обрабатывает некие оконные сообщения ? Осознаешь ли, что диспетчеризацию оконных сообщений в потоках сервиса берет на себя TServiceApplication в случае его использования, а в случае твоем ты вообще никакой диспетчеризации не делаешь ?


 
wbc ©   (2002-12-27 21:19) [10]


> А когда сервис на TService был написан, все работало ?
> Ты вообще представляешь себе отличия в блок. и неблок. режиме
> TServerSocket ? Ты понимаешь, и в том и в другом случае
> TServerSocket генерирует и обрабатывает некие оконные сообщения
> ? Осознаешь ли, что диспетчеризацию оконных сообщений в
> потоках сервиса берет на себя TServiceApplication в случае
> его использования, а в случае твоем ты вообще никакой диспетчеризации
> не делаешь ?


Блок и неблок - конечно представляю. И то что диспетчиризацию не провожу, тоже знаю, я себе плохо представляю как ее можно сделать в данном случае (без TServiceApplication). Или бросить это (TServerSocket) и писать на WinAPI эту часть, а то туловище от одного - ноги от другого - монстр получается.



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

Текущий архив: 2003.02.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-63818
Сатир
2003-02-03 22:55
2003.02.20
Помогите с Юниксом


1-63650
SeNtiMeL
2003-02-11 21:25
2003.02.20
Вопрос по ListView !!!


14-63855
Nickola2
2003-02-05 11:02
2003.02.20
Программисты из Москвы, помогите


3-63483
Дмитрий К.К.
2003-02-04 19:27
2003.02.20
Filter и like


14-63804
LordMax
2003-02-04 00:18
2003.02.20
Копирование