Форум: "Сети";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c