Program filesrv;
Uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
CThreads,
{$ENDIF}{$ENDIF}
DaemonApp, lazdaemonapp, daemonmapperfilesrv, daemonfilesrv
{ add your units here };
begin
Application.Initialize;
Application.Run;
end.
------------------------------------------------------------------------------------------
unit daemonmapperfilesrv;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, DaemonApp;
type
TDaemonMapper1 = class(TDaemonMapper)
private
{ private declarations }
public
{ public declarations }
end;
var
DaemonMapper1: TDaemonMapper1;
implementation
procedure RegisterMapper;
begin
RegisterDaemonMapper(TDaemonMapper1)
end;
{$R *.lfm}
initialization
RegisterMapper;
end.
------------------------------------------------------------------
unit daemonfilesrv;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, DaemonApp, Sockets, IniFiles, Math;
const
INVALID_Socket = -1;
SOCKET_ERROR = -1;
type
TNetConfig = record
IP, LogPath: string;
Port: Integer;
end;
type
TServerThread = class(TThread)
private
FServer: TSocket;
public
procedure Execute; override;
constructor Create(CreateSuspended: Boolean; ParentSock: TSocket);
end;
type
TDaemon1 = class(TDaemon)
procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
procedure DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
private
FSvr: TSocket;
ServerThread: TServerThread;
function GetConfig: TNetConfig;
public
end;
var
Daemon1: TDaemon1;
implementation
procedure RegisterDaemon;
begin
RegisterDaemonClass(TDaemon1)
end;
constructor TServerThread.Create(CreateSuspended: Boolean; ParentSock: TSocket);
begin
inherited Create(CreateSuspended);
//FreeOnTerminate := True;
Fserver := ParentSock;
end;
procedure TServerThread.Execute;
var
ClientSocket: TSocket;
Ra: TSockaddr;
RaLen: TSocklen;
Buf:TByteArray;
BufLen:Integer;
begin
while true do begin
RaLen := SizeOf(Ra);
ClientSocket := fpaccept(Fserver, @Ra, @RaLen);
if ClientSocket<=0 then
break;
BufLen := SizeOf(TByteArray);
BufLen := fprecv(ClientSocket, @Buf, BufLen, 0);
if BufLen > 0 then
fpsend(ClientSocket, @Buf, BufLen, 0);
CloseSocket(ClientSocket);
sleep(100);
end;
end;
procedure TDaemon1.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
var
aConfig: TNetConfig;
addr: TSockAddr;
addrlen: TSocklen;
begin
try
aConfig := GetConfig;
Self.Logger.Active := False;
Self.Logger.FileName := aConfig.LogPath;
Self.Logger.Active:=True;
FSvr := fpSocket(AF_INET, SOCK_STREAM, 0);
if FSvr = SOCKET_ERROR then begin
Self.LogMessage(DateTimeToStr(Now) + ': Create Socket Error !');
OK := False;
exit;
end;
addrlen := sizeof(addr);
fillchar(addr, addrlen, 0);
addr.sin_family := AF_INET;
addr.sin_port := htons(aConfig.Port);
addr.sin_addr.s_addr := htonl(INADDR_ANY);
if fpbind(FSvr, @addr, addrlen)<>0 then begin
Self.LogMessage(DateTimeToStr(Now) + ': Create Server Error !');
OK := False;
Exit;
end;
if fplisten(FSvr, 5)<>0 then begin
Self.LogMessage(DateTimeToStr(Now) + ': Create Server Listen Error !');
OK := False;
Exit;
end;
ServerThread := TServerThread.Create(false, FSvr);
OK := True;
Self.LogMessage(DateTimeToStr(Now) + ': filesrv start succeed !');
except
OK := False;
Self.LogMessage(DateTimeToStr(Now) + ': filesrv start invalid !');
end;
end;
procedure TDaemon1.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
begin
try
if FSvr <> INVALID_Socket then
closesocket(FSvr);
OK:=True;
Self.LogMessage(DateTimeToStr(Now) + ': filesrv stop succeed !');
except
OK:=False;
Self.LogMessage(DateTimeToStr(Now) + ': filesrv stop invalid !');
end;
end;
function TDaemon1.GetConfig: TNetConfig;
var
iniFile: TIniFile;
begin
if FileExistsUTF8('/etc/filesrv.conf') then begin
iniFile := TIniFile.Create('/etc/filesrv.conf');
try
Result.IP := iniFile.ReadString('NetConfig', 'IP', '127.0.0.1');
Result.LogPath := iniFile.ReadString('NetConfig', 'LogPath', '/tmp/filesrv.log');
Result.Port := iniFile.ReadInteger('NetConfig', ' ort', 12345);
finally
iniFile.Free;
end;
end else begin
raise Exception.Create('not found config file: /etc/filesrv.conf !');
end;
end;
{$R *.lfm}
initialization
RegisterDaemon;
end. |