forked from remittor/delphi-iocp-server-sample
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHPServCon.dpr
89 lines (78 loc) · 2.19 KB
/
HPServCon.dpr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
{$IOCHECKS OFF}
{$APPTYPE CONSOLE}
program HPServCon;
uses
Windows, SysUtils,
HPScktSrvr, uHPServCon, uHPServClient;
const
AppName: array [0..9] of Char = 'HPServCon'#0;
var
ParStr: String;
Int32: Integer;
hMutex : THandle;
iExitCode: Cardinal;
bProcessTerminate: Boolean;
function ConsoleProc(CtrlType: DWORD): Bool; stdcall; far;
begin
case CtrlType of
CTRL_C_EVENT,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT,
CTRL_SHUTDOWN_EVENT: begin
bProcessTerminate := True;
end;
end;
Result := True;
end;
begin
HPServerPort := 5000;
if (ParamCount > 0) then begin
for Int32:=1 to ParamCount do begin
ParStr := ParamStr(Int32);
if Pos('/port=', ParStr) = 1 then HPServerPort := StrToIntDef(Copy(ParStr, 7, Length(ParStr)-7+1), 5000);
end;
end;
ParStr := AppName+'_'+IntToStr(HPServerPort);
hMutex := CreateMutex(nil, True , PAnsiChar(ParStr));
if GetLastError = ERROR_ALREADY_EXISTS then begin
CloseHandle(hMutex);
Halt(1);
end;
bProcessTerminate := False;
iExitCode := 0;
Windows.SetConsoleCtrlHandler(@ConsoleProc, True);
HPSrv := THPServerCon.Create(ExtractFileDir(ParamStr(0)));
try
with HPSrv.HPServerSocket do begin
MinimumWorkThreads := 0;
Port := IntToStr(HPServerPort);
AcceptorsCount := 30;
MinimumAcceptors := 15;
AcceptorPriority := apLow;
OnClientBeforeAccept := HPSrv.HPSrvClientBeforeAccept;
OnClientConnect := HPSrv.HPSrvClientConnect;
OnClientDisconnect := HPSrv.HPSrvClientDisconnect;
OnReadComplete := HPSrv.HPSrvReadComplete;
OnWriteComplete := HPSrv.HPSrvWriteComplete;
OnThreadException := HPSrv.HPSrvExceptionEvent;
end;
if not HPSrv.ServerOpen(IntToStr(HPServerPort)) then begin
iExitCode := 10;
Exit;
end;
repeat
Sleep(250);
// îæèäàíèå êîìàíäû çàâåðøåíèÿ
if bProcessTerminate then begin
iExitCode := 0;
HPSrv.ServerClose;
Break;
end;
until False;
finally
HPSrv.Free;
Windows.SetConsoleCtrlHandler(@ConsoleProc, False);
end;
Halt(iExitCode);
end.