当前位置: 首页 > 学习 > 电脑学习 > 程序设计 > Delphi > 实例分析 > 正文

一个定时网络唤醒的Windows 2000服务(Service)程序

http://www.zk168.com.cn  招考学习网 2006-4-7 9:49:56
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--

单位有两台服务器,一台的Bios中有定时启动的功能,而另外一台没有。所以每天早上到单位后第一件事情就是要去按一下这台服务器的电源开关来开机,不甚其烦!今天编写了一个定时网络唤醒的服务(Service)程序,安装在第一台服务器上,这样当第一台服务器启动后,如果到了时间,就会自动通过网络发送WakeOnLine(WOL)的广播包来唤醒另外一台服务器。

步骤:

启动Delphi,File-New-Other-Server Application,然后定义该Service的属性,如图:

保存文件名称为WakeOnlineSrv.pas,该单元的代码如下:

unit WakeOnlineSrv;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
WakeOnlineExecuteThread;

type
TWakeOnLineServer = class(TService)
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
private
{ Private declarations }
ThdWakeOnline:TWakeOnline;
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;

var
WakeOnLineServer: TWakeOnLineServer;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
WakeOnLineServer.Controller(CtrlCode);
end;

function TWakeOnLineServer.GetServiceController: TServiceController;
begin
Result:=ServiceController;
end;

procedure TWakeOnLineServer.ServiceStart(Sender: TService;
var Started: Boolean);
begin
//启动服务
ThdWakeOnline:=TWakeOnline.Create(False);
Started:=True;
end;

procedure TWakeOnLineServer.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
//停止服务
ThdWakeOnline.Terminate;
Stopped:=True;
end;

procedure TWakeOnLineServer.ServicePause(Sender: TService;
var Paused: Boolean);
begin
//暂停服务
ThdWakeOnline.Suspend;
Paused:=True;
end;

procedure TWakeOnLineServer.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
//恢复服务
ThdWakeOnline.Resume;
Continued:=True;
end;

end.

再从File-New-Other-Thread Object,新建一个单元文件,保存文件名称为WakeOnlineExecuteThread.pas,代码如下:

unit WakeOnlineExecuteThread;

interface

uses
Classes, IdUDPClient, SysUtils;

Const
WakeUpTime='07:50'; //Notice that Not 7:50!
StopSendTime='07:51';
TargetComputerMacAddress='00025556E5C5';

type
TWakeOnLine = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

var Sent:Boolean=False;

implementation

{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure WakeOnLine.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ WakeOnLine }

procedure TWakeOnLine.Execute;
var
MacAddr:String;
FUDP: TIdUDPClient;
SendCode:string;
I,J: Integer;
Bin: String[6];
begin
{ Place thread code here }
//线程终止时自动释放
Self.FreeOnTerminate:=True;
//发送标志
Sent:=False;
//如果线程没有被终止则运行下面的循环
while not Terminated do
begin
//如果没有发送,并且已经到了发送的时间
if (not Sent) and (Copy(FormatDateTime('hh:mm:ss',Now),1,5)=WakeUpTime) then
begin
//开始发送
MacAddr:=TargetComputerMacAddress;

FUDP:=TIdUDPClient.Create(nil);
try
FUDP.Port:=7;
FUDP.Host:='10.10.10.2';
FUDP.Active:=True;

HextoBin(PChar(MacAddr),@Bin,6);
SendCode:=StringofChar(#255,6);

//填充缓冲区
for I:=0 to 15 do
for J:=0 to 5 do
SendCode:=SendCode+Bin[J];

//连续发送6次,保险啊。。。
for I:=0 to 5 do
FUDP.Broadcast(SendCode,7);

finally
FUDP.Free;
end;

Sent:=True;

end else

begin
//如果已经发送,并且已经到了发送时间的下一分钟,则重置发送标志以备下一天还能发送
if Sent and (Copy(FormatDateTime('hh:mm:ss',Now),1,5)=StopSendTime) then
Sent:=False;

//休息30秒,避免浪费资源
Sleep(30000);
end;

//如果有终止信号则终止
if Terminated then Break;

end;

end;

end.

最后保存工程文件名称为WakeOnline.dpr,内容如下:

program WakeOnline;

uses
SvcMgr,
WakeOnlineSrv in 'WakeOnlineSrv.pas' {WakeOnLineServer: TService},
WakeOnlineExecuteThread in 'WakeOnlineExecuteThread.pas';

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TWakeOnLineServer, WakeOnLineServer);
Application.Run;
end.

给这个服务程序选择一个合适的图标,最后编译生成一个名称为WakeOnLine.Exe可执行文件。

到Cmd窗口去安装该服务程序:执行:WakeOnLine -install,会提示服务已经成功安装:

然后鼠标右击我的电脑-管理-服务和应用程序-服务,然后找到刚刚安装好的服务:Wake On Line Server,

可以看到它还没有启动,现在双击它,点击启动:


我在程序中指定的时间是早上7:50分发送广播,启动一个网络包抓取程序,将时间调节到早上7:49来测试一下,等带一会儿,看看抓到了什么:

目标机器启动啦。。。

(说明:Delphi 7编译;CISCO 2950交换机;被唤醒的是IBM X205服务器,注意将Bios中的Wake On Line选项Enable)

-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
最新入库:
 
·实质、过程及意义——阿多尔诺“否定的辩证法”探微
·从Ontology的译名之争看哲学术语的翻译原则
·论马克思主义哲学经典的解释——解释学方法及其在马克
·中国哲学当前的核心与周边问题
·和合学与21世纪文化价值和科技
·中国文化的和合精神与21世纪
·宗教之间理当相互宽容
·上半个世纪的自由主义
·殷周至春秋时期神人关系之演进
·大学之道:构建以“三纲八目”为核心的道德修养体系
相关内容:
 
·网络在燃气行业的应用
·21世纪以煤和天然气为原料的C1化学
·网络环境下会计系统的安全审计
·网络审计的结构和应用中的问题
·浅谈计算机网络环境下的注册会计师审计
·网络时代审计模式创新初探
·论电子商务时代的网络审计
·OECD主要国家软件业发展概况
·论网络时代会计目标下的会计业务流程重组 2
·网络时代审计的创新
网友点评:
 
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
友情提醒:
 1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网
 友来信指正!
 2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
 3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
 4.如需转载请注明出处及作者,谢谢合作!
 5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
 6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
 7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL:  XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接!
你问我答 更多>>