Wake-on-LAN ( WOL ; oversat fra engelsk. - "Vågn op på [et signal fra] et lokalt netværk ") - en teknologi, der giver dig mulighed for at fjerntænde en computer ved at sende en speciel sekvens af bytes over et lokalt netværk - en datapakke (den såkaldte magiske pakke - "magisk pakke", se nedenfor ). Denne pakke kan indsættes i pakker med et hvilket som helst højere niveau standardprotokoller , såsom UDP eller IPX .
Du skal også kunne sende en magisk pakke til den administrerede computer. Dette kan for eksempel gøres ved at bruge en anden computer med det relevante program (se eksempler nedenfor ).
Den styrede computer er i standby-tilstand ( eng. standby - den tilstand, der er angivet i ATX -specifikationen , hvor kun standby + 5VSB for alle strømforsyningens udgangskredsløb er aktive) og leverer strøm til BIOS -chippen og netværksadapter [1] . Netværksadapteren er i lavstrømstilstand, mens dens mikrocontroller analyserer alle pakker, der kommer til den tilsvarende MAC-adresse uden at reagere på dem. Hvis en af pakkerne viser sig at være magisk pakke , vil netværksadapteren afgive et signal om at tænde for computeren.
engelsk Magic packet er en speciel sekvens af bytes, der kan indsættes i transportlagspakker , der ikke kræver en forbindelse (f.eks. UDP-protokol eller ældre IPX ) til normal gennemkøring af lokale netværk. For Wake-on-LAN udsendes typisk protokolpakker i det øvre lag, fordi det i tilfælde af dynamisk adressetildeling ikke vides, hvilken IP-adresse der svarer til hvilken MAC-adresse. Men for at passere korrekt gennem en router, der forbyder broadcast-pakker, kan du sende pakken til en bestemt adresse.
I begyndelsen af pakken er der en såkaldt synkroniseringskæde: 6 bytes svarende til 0xFF. Derefter - MAC-adressen på netværkskortet, gentaget 16 gange . Det vil sige, hvis adressen på tavlen så ud som 01:02:03:04:05:06 , så ville den magiske pakke være sådan her:
FFFFFFFFFFFF010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506010203040506 010203040506Opgaven med at skrive et program, der sender en magisk pakke, er ret enkel og gives ofte som en vejledning, når man lærer det grundlæggende i netværk. Nedenfor er to eksempler på sådanne programmer i kildekoder:
Kode i C# bruger System ; ved hjælp af System.Net.Sockets ; ved hjælp af System.Net ; ved hjælp af System.Collections.Generic ; navneområde Wol { class Program { static void Main ( string [] args ) { using ( UdpClient udpClient = new UdpClient ()) { Console . WriteLine ( "Indtast mac-adresse" ); byte [] mac = StrToMac ( Console.ReadLine ( ) ); udpClient . Send ( mac , mac . Længde , ny IPEndPoint ( IPAddress . Broadcast , 9 )); } } statisk byte [] StrToMac ( string s ) { List < byte > arr = new List < byte >( 102 ); streng [] macs = s . Split ( ' ' , ':' , '-' ); for ( int i = 0 ; i < 6 ; i ++) arr . Tilføj ( 0xff ) ; for ( int j = 0 ; j < 16 ; j ++) for ( int i = 0 ; i < 6 ; i ++) arr . Tilføj ( Convert.ToByte ( macs [ i ] , 16 ) ); retur arr . ToArray (); } } } Kode i DelphiTilpasset til Delphi7 version.
enhed WOL ; interface bruger Windows , Messages , SysUtils , Varianter , Classes , Graphics , Controls , Forms , Dialogs , IdBaseComponent , IdComponent , IdUDPBase , IdUDPClient , IdGlobal , StdCtrls ; type TForm1 = klasse ( TForm ) Edit1 : TEdit ; Knap1 : TBnap ; procedure Button1Click ( Afsender : TObject ) ; private { Private declarations } public { Offentlige declarations } end ; var Form1 : TForm1 ; implementering {$R *.dfm} type TMACAddress = pakket record case heltal på 0 : ( s1 , s2 , s3 , s4 , s5 , s6 : byte ; ) ; 1 : ( cmp1 : ord ; cmp2 : heltal ; ) ; ende ; TWakeupMagicPacket = pakket record FillFF : array [ 0..5 ] af byte ; _ _ Mac : array [ 0..15 ] af TMACaddress ; _ _ ende ; funktion TryStrToMac ( str : streng ; var mac : TMACaddress ) : boolean ; var a , b : heltal ; const ToHex = '0123456789ABCDEF' ; start Resultat := falsk ; str := AnsiUpperCase ( trim ( str ) ) ; hvis længde ( str ) < 17 så start mac . cmp1 := 0 ; mac . cmp2 := 0 ; udgang ; ende ; a : = pos ( str [ 1 ] , ToHex ) -1 ; b : = pos ( str [ 2 ] , ToHex ) -1 ; hvis (( a >= 0 ) og ( b >= 0 ) og ( str [ 3 ] = '-' )), så mac . s1 := a * 16 + b ellers udgang ; a : = pos ( str [ 4 ] , ToHex ) -1 ; b : = pos ( str [ 5 ] , ToHex ) -1 ; hvis (( a >= 0 ) og ( b >= 0 ) og ( str [ 6 ] = '-' )), så mac . s2 := a * 16 + b ellers udgang ; a : = pos ( str [ 7 ] , ToHex ) -1 ; b : = pos ( str [ 8 ] , ToHex ) -1 ; hvis (( a >= 0 ) og ( b >= 0 ) og ( str [ 9 ] = '-' )), så mac . s3 := a * 16 + b ellers udgang ; a : = pos ( str [ 10 ] , ToHex ) -1 ; b : = pos ( str [ 11 ] , ToHex ) -1 ; hvis (( a >= 0 ) og ( b >= 0 ) og ( str [ 12 ] = '-' )), så mac . s4 := a * 16 + b ellers udgang ; a : = pos ( str [ 13 ] , ToHex ) -1 ; b : = pos ( str [ 14 ] , ToHex ) -1 ; hvis (( a >= 0 ) og ( b >= 0 ) og ( str [ 15 ] = '-' )), så mac . s5 := a * 16 + b ellers udgang ; a : = pos ( str [ 16 ] , ToHex ) -1 ; b : = pos ( str [ 17 ] , ToHex ) -1 ; hvis (( a >= 0 ) og ( b >= 0 )), så mac . s6 := a * 16 + b ellers udgang ; Resultat := sandt ; ende ; funktion TryWakeUpComputer ( const MacAddress : string ) : boolean ; var i : heltal ; mac : TMACaddress ; pkt : TWakeupMagicPacket ; start Resultat := falsk ; hvis ikke TryStrToMac ( MacAddress , mac ) så afslut ; FillChar ( pkt . FillFF [ 0 ] , SizeOf ( pkt . FillFF ) , $FF ) ; for i := 0 til Høj ( pkt . Mac ) gør pkt . Mac [ i ] := mac ; med TIdUDPClient . Opret ( nul ) prøv BroadcastEnabled : = True ; Vært := '255.255.255.255' ; Port := 9 ; SendBuffer ( pkt , størrelse af ( pkt )) ; Resultat := sandt ; endelig Fri ; ende ; ende ; procedure TForm1 . Button1Click ( Afsender : TObject ) ; start hvis ikke TryWakeUpComputer ( Rediger1 . Tekst ) så \\Mac View BC - AE - C5-8E - 0 A - 2 C start // Gør noget... vis besked ( 'FEJL' ) ; ende ; ende ;