type
TEDQQSERV = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServiceAfterInstall(Sender: TService);
procedure ServiceAfterUninstall(Sender: TService);
procedure ServiceShutdown(Sender: TService);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
TEffortQQReceThread = class(TThread) //消息接收线程
private
{ Private declarations } _Str: ansistring;
protected
procedure Execute; override;
public
constructor Create(param: TSocket; CreateSuspended: Boolean);
procedure ParseCommand;
end;
var
EDQQSERV: TEDQQSERV;
EffortUdp: TSocket;
EffortQQThread: TEffortQQReceThread;
_udp: TSocket;
send: TSockAddrIn;
//EDQQ服务器,包含UDP接收服务器,WEB服务器
implementation{$R *.DFM}
function InitWas: Boolean;
var
wsaData: TWSAData;
begin
WriteLog('开始sock初始化!');
if WSAStartup($0202, wsaData) = 0 then
Result := True
else
Result := False;
end;function MKSock: TSocket;
begin
Result := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
end;function StartUdp: Word;
var
local: TSockAddr;
begin
Result := 0;
if InitWas then
begin
WriteLog('sock初始化成功!');
EffortUdp := MKSock;
local.sin_family := AF_INET; local.sin_addr.S_addr := htonl(INADDR_ANY);
if EffortUdp > 0 then
begin
local.sin_port := htons(9990);
Result := bind(EffortUdp, local, SIZEOF(local));
if Result = 0 then
begin
Result := 1;
EffortQQThread :=
TEffortQQReceThread.Create(EffortUdp, False); WriteLog('sock启动成功!');
end
else
WriteLog('sock启动失败! 无法绑定!');
end
else
WriteLog('sock创建失败!');
end
else
WriteLog('无法初始化sock!');
end;constructor TEffortQQReceThread.Create(param: TSocket;
CreateSuspended: Boolean);
begin
_udp := param;
inherited Create(CreateSuspended);
end;procedure TEffortQQReceThread.Execute;
var
buf: array[1..4096] of Char;
rec: Integer;
recstr: ansistring;
begin
while True do
begin
rec := sizeof(send);
rec := recvfrom(_UDP, buf, sizeof(buf), 0, send, rec);
if rec > 0 then
begin
recstr := buf;
SetLength(recstr, rec);
WriteLog( recstr);
_Str := recstr;
try
WriteLog('rece from ' +
inet_ntoa(send.sin_addr) + ':' + IntToStr(ntohs(send.sin_port))
+ ' --' + _Str);
Synchronize(ParseCommand); except
end;
end
else
begin
Writelog( 'rece error!' + IntToStr(WSAGetLastError));
end;
end;
end;procedure TEffortQQReceThread.ParseCommand;
beginend;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
EDQQSERV.Controller(CtrlCode);
end;function TEDQQSERV.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TEDQQSERV.ServiceStart(Sender: TService; var Started: Boolean);
begin
WriteLog('服务启动'); StartUdp;
EffortQQThread.Resume;
Started:=true;end;procedure TEDQQSERV.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
WriteLog('服务停止'); EffortQQThread.Terminate;
Stopped:=true;
end;procedure TEDQQSERV.ServicePause(Sender: TService; var Paused: Boolean);
begin
WriteLog('服务暂停');
end;procedure TEDQQSERV.ServiceExecute(Sender: TService);
begin
WriteLog('服务运行');
if EffortQQThread<>nil then
EffortQQThread.Resume
else
StartUdp;
EffortQQThread.Resume;
end;procedure TEDQQSERV.ServiceAfterInstall(Sender: TService);
begin
WriteLog('服务安装成功!');
end;procedure TEDQQSERV.ServiceAfterUninstall(Sender: TService);
begin
WriteLog('服务移除成功!');
end;procedure TEDQQSERV.ServiceShutdown(Sender: TService);
begin
WriteLog('服务脱机!');
end;procedure TEDQQSERV.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
WriteLog('服务继续!');
end;
TEDQQSERV = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServiceAfterInstall(Sender: TService);
procedure ServiceAfterUninstall(Sender: TService);
procedure ServiceShutdown(Sender: TService);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
TEffortQQReceThread = class(TThread) //消息接收线程
private
{ Private declarations } _Str: ansistring;
protected
procedure Execute; override;
public
constructor Create(param: TSocket; CreateSuspended: Boolean);
procedure ParseCommand;
end;
var
EDQQSERV: TEDQQSERV;
EffortUdp: TSocket;
EffortQQThread: TEffortQQReceThread;
_udp: TSocket;
send: TSockAddrIn;
//EDQQ服务器,包含UDP接收服务器,WEB服务器
implementation{$R *.DFM}
function InitWas: Boolean;
var
wsaData: TWSAData;
begin
WriteLog('开始sock初始化!');
if WSAStartup($0202, wsaData) = 0 then
Result := True
else
Result := False;
end;function MKSock: TSocket;
begin
Result := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
end;function StartUdp: Word;
var
local: TSockAddr;
begin
Result := 0;
if InitWas then
begin
WriteLog('sock初始化成功!');
EffortUdp := MKSock;
local.sin_family := AF_INET; local.sin_addr.S_addr := htonl(INADDR_ANY);
if EffortUdp > 0 then
begin
local.sin_port := htons(9990);
Result := bind(EffortUdp, local, SIZEOF(local));
if Result = 0 then
begin
Result := 1;
EffortQQThread :=
TEffortQQReceThread.Create(EffortUdp, False); WriteLog('sock启动成功!');
end
else
WriteLog('sock启动失败! 无法绑定!');
end
else
WriteLog('sock创建失败!');
end
else
WriteLog('无法初始化sock!');
end;constructor TEffortQQReceThread.Create(param: TSocket;
CreateSuspended: Boolean);
begin
_udp := param;
inherited Create(CreateSuspended);
end;procedure TEffortQQReceThread.Execute;
var
buf: array[1..4096] of Char;
rec: Integer;
recstr: ansistring;
begin
while True do
begin
rec := sizeof(send);
rec := recvfrom(_UDP, buf, sizeof(buf), 0, send, rec);
if rec > 0 then
begin
recstr := buf;
SetLength(recstr, rec);
WriteLog( recstr);
_Str := recstr;
try
WriteLog('rece from ' +
inet_ntoa(send.sin_addr) + ':' + IntToStr(ntohs(send.sin_port))
+ ' --' + _Str);
Synchronize(ParseCommand); except
end;
end
else
begin
Writelog( 'rece error!' + IntToStr(WSAGetLastError));
end;
end;
end;procedure TEffortQQReceThread.ParseCommand;
beginend;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
EDQQSERV.Controller(CtrlCode);
end;function TEDQQSERV.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TEDQQSERV.ServiceStart(Sender: TService; var Started: Boolean);
begin
WriteLog('服务启动'); StartUdp;
EffortQQThread.Resume;
Started:=true;end;procedure TEDQQSERV.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
WriteLog('服务停止'); EffortQQThread.Terminate;
Stopped:=true;
end;procedure TEDQQSERV.ServicePause(Sender: TService; var Paused: Boolean);
begin
WriteLog('服务暂停');
end;procedure TEDQQSERV.ServiceExecute(Sender: TService);
begin
WriteLog('服务运行');
if EffortQQThread<>nil then
EffortQQThread.Resume
else
StartUdp;
EffortQQThread.Resume;
end;procedure TEDQQSERV.ServiceAfterInstall(Sender: TService);
begin
WriteLog('服务安装成功!');
end;procedure TEDQQSERV.ServiceAfterUninstall(Sender: TService);
begin
WriteLog('服务移除成功!');
end;procedure TEDQQSERV.ServiceShutdown(Sender: TService);
begin
WriteLog('服务脱机!');
end;procedure TEDQQSERV.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
WriteLog('服务继续!');
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货