捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
局域网远程开机的原理
关键字:BIOS LAN 远程开机 局域网 远程唤醒 WOL
来 自:原创
平 台:Win9x,Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:初级 完成时间:2006/1/28
发布者:cjrb 发布时间:2006/1/28
编辑器:DELPHI6 语  种:简体中文
分 类:网络 下载浏览:0/22454
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
无图片
远程开机再配合远程控制

procedure TForm1.Button2Click(Sender: TObject);
var
  vBuf:array[0..101] of char;
  i,j:integer;
begin
  //包的格式很简单,在以太网包的任何位置上,
  //以6个FF为先导,后面跟相应MAC地址重复16次即可:
  for i:=0 to 5 do vBuf:=char($FF);
  for i:=0 to 15 do
  begin
    j:=6+i*6;
    vBuf[j]  :=Char($00);
    vBuf[j+1]:=Char($13);
    vBuf[j+2]:=Char($D4);
    vBuf[j+3]:=Char($04);
    vBuf[j+4]:=Char($55);
    vBuf[j+5]:=Char($80);
  end;
  NMUDP1.RemoteHost:='192.168.1.255';
  NMUDP1.SendBuffer(vBuf,Length(vBuf));
end;

以下为NetWaker的要求,也是远程开机的要求,一般现在的机子都有支持。

1.硬件需求

  实现网络开机,需要主板、网卡、电源3个设备支持。首先需要查看主板使用说明书,查看主板是否支持Wake-Up On Internal Modem(WOM)或者Wake-up On LAN(WOL)技术,如果支持就说明主板支持远程开机。能否实现远程唤醒,其中最主要的一个部件就是支持WOL的网卡,远端被唤醒计算机的网卡必须支持WOL,而用于唤醒其他计算机的网卡则不必支持WOL。另外,当一台计算机中安装有多块网卡时,只须将其中的一块设置为可远程唤醒即可。

  除此以外,电脑必须安装有符合ATX 2.03标准的ATX电源,+5VStandby电流至少应在720mA以上。有的早期电源可能只设计到500mA,在进行网络开机时,某些耗电较大的网卡可能会无法启动。

  2.CMOS设置

  首先需要进行CMOS和网卡设置,启动计算机,进入CMOS参数设置。选择电源管理设置“Power Management Setup”菜单,将“Wake up on LAN”项和“Wake on PCI Card”项均设置为“Enable”,启用该计算机的远程唤醒功能。有些网卡需要通过跳线将“Wake-on-LAN”功能设置为“Enable”。

  将WOL电缆的两端分别插入网卡和主板的3芯插座中,将网卡与计算机主板连接起来。如果主板支持PCI 2.2标准,只要开启“Wake on PCI Card”功能就可以了,无须使用WOL电缆连接。然后启动计算机,安装网卡驱动程序并完成网卡的网络连接设置。

-----
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
WinSock编程远程开机局域网唤醒
400109 2007/2/4 下+3998/浏+14503 评+4
局域网扫描、远程启动
litbug 2006/2/1 下+4869/浏+17477 评+14
局域网远程开机的原理
cjrb 2006/1/28 下+0/浏+22455 评+12
相关评论
共有评论12条 当前显示最后6条评论
gdsa 2006/1/30 17:42:35
NMUDP1是什么控件
gdsa 2006/1/30 18:09:58
我用这段代码为何不管用,但用在别的地方下的代码在同样的机器上是可以的!!
代码如下(我不知如何贴附件):
unit WakeUp;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, WinSock,
  StdCtrls,Dialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function CheckWinSockResult(ResultCode: Integer; const FuncName: string): Integer;
  end;

 const 
     LEN_PHYSADDR = 6;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.CheckWinSockResult(ResultCode: Integer;
  const FuncName: string): Integer;
begin
  if ResultCode <> 0 then
     begin 
     Result := WSAGetLastError; 
     ShowMessage(Format(#13#10'Windows socket函数''%s''错误: %s (%d)',[FuncName,SysErrorMessage(Result), Result])); 
     Abort; 
     end else Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var 
  WSAData: TWSAData;
  MSocket: TSocket;
  SockAddrIn: TSockAddrIn;
  RetVal, OptVal, i: Integer;
  MacAddr: array[0..5] of Byte;
  MagicData: array[0..101] of Byte;
  Position: Longint;
  SAddr:string;
begin
  SAddr:=edit1.Text;//网卡的MAC地址
  //00-0d-61-93-20-dc
  try
    if Length(SAddr) <> 17 then Abort;
    for i := 1 to Length(SAddr) do
      if i in [3, 6, 9, 12, 15] then
        if SAddr[i] <> '-' then Abort;
          for i := 0 to High(MacAddr) do
          begin
          if Pos('-', SAddr) > 0 then
          MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1))
          else
          MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr);
          Delete(SAddr, 1, Pos('-', SAddr));
          end;
      except
        ShowMessage(#13#10'网卡地址错误.');
        exit;
      end;
     try
      CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup');
      MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
      if MSocket = INVALID_SOCKET then CheckWinSockResult(MSocket, 'socket');
      OptVal := 1;
     CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST,
     PChar(@OptVal), SizeOf(OptVal)), 'setsockopt');
     FillChar(MagicData, SizeOf(MagicData), $FF); 
     Position := LEN_PHYSADDR;
     while Position < SizeOf(MagicData) do 
     begin 
     Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR);
     Inc(Position, LEN_PHYSADDR); 
     end; 
     SockAddrIn.sin_family := AF_INET; 
     SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST); 
     RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn)); 
     if RetVal = SOCKET_ERROR then CheckWinSockResult(RetVal, 'sendto'); 
     CheckWinSockResult(closesocket(MSocket), 'closesocket'); 
     CheckWinSockResult(WSACleanup, 'WSACleanup'); 
     except 
     exit; 
     end;
end;

end.
wwdawyn 2006/2/3 0:14:17
老兄们,我知道了远程开机的原理,能不能说说,远程关机的原理呀,就是网卡支持,远程开关机!能不能给大家说说!最好在代码!
etqxq 2006/9/8 13:52:56
$80 是什么意思
promiseclx 2008/7/19 19:55:35
我想知道怎么回事,我写了一个程序,用 wep查看发的包完全一样但是却不可以远程开机!
loadymf 2011/4/19 14:17:37
代码不错,不过有不能使用修改二个地方
一 修改下面的:
for i:=0 to 5 do vBuf:=char($FF);
改为:for i:=0 to 5 do vBuf[i]:=char($FF);
二在下面前面加入一句NMUDP1.RemotePort:=4608;
  NMUDP1.RemoteHost:='192.168.1.255';
  NMUDP1.SendBuffer(vBuf,Length(vBuf));
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表