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;