Wake-on-LAN ( WOL ; traducido del inglés. - "Despertar en [una señal de] una red local ") - una tecnología que le permite encender una computadora de forma remota enviando una secuencia especial de bytes a través de una red local - un paquete de datos (el llamado paquete mágico - "paquete mágico", ver más abajo ). Este paquete se puede insertar en paquetes de cualquier protocolo estándar de nivel superior , como UDP o IPX .
También debe poder enviar un paquete mágico a la computadora administrada. Esto se puede hacer, por ejemplo, usando otra computadora con el programa apropiado (vea los ejemplos a continuación ).
La computadora controlada está en modo de espera ( ing. stand-by - el modo previsto por la especificación ATX , en el que solo está activo el standby + 5VSB de todos los circuitos de salida de la fuente de alimentación) y suministra energía al chip BIOS y adaptador de red [1] . El adaptador de red está en modo de bajo consumo, mientras que su microcontrolador analiza todos los paquetes que llegan a la dirección MAC correspondiente , sin responder a ellos. Si uno de los paquetes resulta ser un paquete mágico , el adaptador de red emitirá una señal para encender la computadora.
inglés El paquete mágico es una secuencia especial de bytes que se puede insertar en los paquetes de la capa de transporte que no requieren una conexión (por ejemplo, el protocolo UDP o IPX heredado) para el paso normal de las redes locales. Por lo general, para Wake-on-LAN, los paquetes de protocolo de capa superior se transmiten porque, en el caso de la asignación dinámica de direcciones, no se sabe qué dirección IP corresponde a qué dirección MAC. Sin embargo, para pasar correctamente a través de un enrutador que prohíbe la transmisión de paquetes, puede enviar el paquete a alguna dirección específica.
Al comienzo del paquete hay una llamada cadena de sincronización: 6 bytes igual a 0xFF. Luego, la dirección MAC de la tarjeta de red, repetida 16 veces . Es decir, si la dirección de la placa fuera 01:02:03:04:05:06 , entonces el paquete mágico sería así:
FFFFFFFFFFFF010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506La tarea de escribir un programa que envíe un paquete mágico es bastante simple y, a menudo, se proporciona como un tutorial cuando se aprenden los conceptos básicos de la creación de redes. A continuación se muestran dos ejemplos de dichos programas en códigos fuente:
Código en C# utilizando el sistema ; utilizando System.Net.Sockets ; utilizando System.Net ; usando System.Collections.Generic ; espacio de nombres Wol { class Program { static void Main ( string [] args ) { using ( UdpClient udpClient = new UdpClient ()) { Console . WriteLine ( "Ingrese la dirección mac" ); byte [] mac = StrToMac ( Console.ReadLine ( ) ); clienteupp . Enviar ( mac , mac . Longitud , nuevo IPEndPoint ( IPAddress . Broadcast , 9 )); } } byte estático [] StrToMac ( string s ) { List < byte > arr = new List < byte >( 102 ); cadena [] macs = s . Dividir ( ' ' , ':' , '-' ); para ( int i = 0 ; i < 6 ; i ++) arr . Añadir ( 0xff ) ; para ( int j = 0 ; j < 16 ; j ++) para ( int i = 0 ; i < 6 ; i ++) arr . Añadir ( Convert.ToByte ( macs [ i ] , 16 ) ); volver arr . a la matriz (); } } } Código en DelphiAdaptado para la versión Delphi7.
unidad WOL ; interfaz utiliza Windows , Mensajes , SysUtils , Variantes , Clases , Gráficos , Controles , Formularios , Diálogos , IdBaseComponent , IdComponent , IdUDPBase , IdUDPClient , IdGlobal , StdCtrls ; tipo TForm1 = clase ( TForm ) Edit1 : TEdit ; Botón1 : BotónT ; procedimiento Button1Click ( Remitente : TObject ) ; private { Declaraciones privadas } public { Declaraciones públicas } end ; var Formulario1 : TForm1 ; implementación {$R *.dfm} escriba TMACAddress = entero de caso de registro empaquetado de 0 : ( s1 , s2 , s3 , s4 , s5 , s6 : byte ; ) ; 1 : ( cmp1 : palabra ; cmp2 : entero ; ) ; fin ; TWakeupMagicPacket = registro empaquetado FillFF : matriz [ 0 .. 5 ] de byte ; Mac : matriz [ 0 .. 15 ] de TMACAddress ; fin ; function TryStrToMac ( str : string ; var mac : TMACAddress ) : boolean ; var a , b : entero ; const ToHex = '0123456789ABCDEF' ; comenzar Resultado : = falso ; str := AnsiUpperCase ( recortar ( str )) ; si la longitud ( str ) < 17 entonces comienza mac . cmp1 := 0 ; mac _ cmp2 := 0 ; salida ; fin ; a := pos ( str [ 1 ] , ToHex ) - 1 ; b := pos ( str [ 2 ] , ToHex ) - 1 ; si (( a >= 0 ) y ( b >= 0 ) y ( str [ 3 ] = '-' )) entonces mac . s1 := a * 16 + b si no salir ; a := pos ( str [ 4 ] , ToHex ) - 1 ; b := pos ( str [ 5 ] , ToHex ) - 1 ; si (( a >= 0 ) y ( b >= 0 ) y ( str [ 6 ] = '-' )) entonces mac . s2 := a * 16 + b sino salir ; a := pos ( str [ 7 ] , ToHex ) - 1 ; b := pos ( str [ 8 ] , ToHex ) - 1 ; si (( a >= 0 ) y ( b >= 0 ) y ( str [ 9 ] = '-' )) entonces mac . s3 := a * 16 + b si no salir ; a := pos ( str [ 10 ] , ToHex ) - 1 ; b := pos ( str [ 11 ] , ToHex ) - 1 ; si (( a >= 0 ) y ( b >= 0 ) y ( str [ 12 ] = '-' )) entonces mac . s4 := a * 16 + b si no salir ; a := pos ( str [ 13 ] , ToHex ) - 1 ; b := pos ( str [ 14 ] , ToHex ) - 1 ; si (( a >= 0 ) y ( b >= 0 ) y ( str [ 15 ] = '-' )) entonces mac . s5 := a * 16 + b sino salir ; a := pos ( str [ 16 ] , ToHex ) - 1 ; b := pos ( str [ 17 ] , ToHex ) - 1 ; si (( a >= 0 ) y ( b >= 0 )) entonces mac . s6 := a * 16 + b si no salir ; Resultado := verdadero ; fin ; function TryWakeUpComputer ( const MacAddress : string ) : booleano ; var i : entero ; mac : DirecciónTMAC ; paquete : TWakeupMagicPacket ; comenzar Resultado : = falso ; si no es TryStrToMac ( MacAddress , mac ) , salga ; FillChar ( paquete . FillFF [ 0 ] , SizeOf ( paquete . FillFF ) , $FF ) ; para i := 0 a Alto ( pkt . Mac ) haga pkt . mac [ i ] := mac ; con TIdUDPClient . Crear ( nil ) intente BroadcastEnabled : = True ; Anfitrión : = '255.255.255.255' ; Puerto := 9 ; SendBuffer ( paquete , tamaño de ( paquete )) ; Resultado := verdadero ; finalmente Libre ; fin ; fin ; procedimiento TForm1 . Button1Click ( Remitente : TObject ) ; comenzar si no TryWakeUpComputer ( Edit1 . Text ) entonces \\Mac View BC - AE - C5 - 8E-0 A - 2 C comenzar // Hacer algo... mostrar mensaje ( 'ERROR' ) ; fin ; fin ;