庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>Delphi语言>实例分析>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

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

 作者:本站收集   日期:2005-3-14
字号选择〖 〗/ 双击滚屏 单击停止   

单位有两台服务器,一台的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)

上一篇:金额大写转换    下一篇:QQ聊天记录器演示程序(二)  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-3-14
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿