Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
4-63914
z0ne
2003-01-09 09:33
2003.02.20
Картинка с произвольным dpi


3-63569
Dik
2003-02-04 01:50
2003.02.20
DBComboBox


1-63674
Zirus
2003-02-12 06:04
2003.02.20
копирование формы


14-63814
Борец за свободу
2003-02-04 13:50
2003.02.20
Правда о Родине.


6-63695
BJValentine
2002-12-26 19:47
2003.02.20
Удаленный клиент





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