begin process at 2008 07 04 23:05:26
1 204 970 membres
486 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

WAKE ON LAN


Information sur la source

Catégorie :Réseau & Internet Classé sous : wol, wakeonlan, reseau, wakeup, reveiller Niveau : Initié Date de création : 28/08/2006 Date de mise à jour : 30/08/2006 10:09:33 Vu / téléchargé: 10 609 / 1 718

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

Description

Reveillez les machines éteinte de votre réseau ?
C'est possible avec le Wake On LAN.

Toutes les cartes réseaux actuelles supporte normalement ce protocol qu'est le WOL. Il suffit d'activer dans le bios de votre machine la fonction "Wake On LAN" et d'exporter le paquet magique, ce paquet est de la forme 6 x "FF" suivi de 16 x l'adresse MAC de la machine à reveiller.

ex : (sniffé sur mon réseau)
-----------------------------
ff ff ff ff ff ff 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62 00 40 e3 e9
c8 62 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62 00 40
e3 e9 c8 62 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62
00 40 e3 e9 c8 62 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62 00 40 e3 e9
c8 62 00 40 e3 e9 c8 62 00 40 e3 e9 c8 62

Les cartes réseaux WOL, sont en permanantes écoutent, même quand votre pc est éteind.
Dès qu'une carte voit un paquet avec 16 fois son adresse MAC elle donne l'ordre à la carte mère de se réveiller tout comme si vous appuyez sur Power.

C'est un protocole de couche 2, et oui une carte reseau n'a pas d'IP, on travail ici uniquement avec les adresses MAC.

Conclusion

Veillez à bien activer le Wake On LAN dans le BIOS et d'avoir des cartes reseaux supportant ce protocole.

Notes et commentaires sont les bienvenues.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

28 août 2006 21:16:40 :
petite correction :-)
29 août 2006 09:16:23 :
Correction depassement de capacité sur un tableau
30 août 2006 10:09:33 :
Corrections apportées par fOxy <br> Ajout par adresse IP
  • signaler à un administrateur
    Commentaire de Also know as le 28/08/2006 21:12:25

    Super ta source,

    J'en avais déjà entendu parlais mais malehureusement je n'ai pas cette capacité à pouvoir réveiller mon PC par le WOL.

    Mais sinon c'est assez utile pour réveiller un PC depuis n'importe quel PC et pas seulement de son réseau !

    @+

  • signaler à un administrateur
    Commentaire de elguevel le 28/08/2006 21:35:47

    Je suis désolé mais j'vient de faire çà cet aprème, et j'mapperçoie que par rapport à ce que je fait d'habitude c'est un peu caca. Mais promis demain je remet çà d'aplomb et je corrigerai certaines erreurs qui plante le programme au bout d'un certain temps.

    Also know as > Merci pour le com :-)

    A+

  • signaler à un administrateur
    Commentaire de f0xi le 28/08/2006 22:07:51 administrateur CS

    @Elguevel : Trés interressant! mais je dois quand meme faire une mise en garde que je te suggere de mettre en entete de ta presentation.

    En gros, activer les evenements PME dans le bios diminue enorment la securitée de la machine et du reseaux. Il est donc recommendé de ne les activer que si on est réellement sur de sa securité et qu'on dispose de tout le materiel et competences necessaires pour l'utilisation de ces evenements.

    En effet, il n'est pas rare que les modems/routeurs/switchs balances ces evenements de temps en temps ce qui reveille tout les ordis du reseaux qui sont donc impossible a arreter (sauf power off de l'alim).
    de plus il n'y a aucun control d'identitée de la machine qui tente de reveiller l'ordinateur, donc un pirate/virus peu utiliser ces evenements pour penetrer dans le systeme.

  • signaler à un administrateur
    Commentaire de elguevel le 28/08/2006 22:14:32

    J'en suis tout à fait conscient, et je ne parle pas ici des problèmes de sécurité. Car pour moi le Wake On Lan se limite à démarrer la machine, ce qui ne veut pas dire qu'on y aura necessairement accès par la suite.

    Par contre un tel programme peut augmenter votre factures EDF :-)

    Sinon demain je regarderai ce qui ne va pas dans mon code, mais à prioris plusieurs appels à Winsock plante mon application.

  • signaler à un administrateur
    Commentaire de elguevel le 29/08/2006 11:55:16

    Voila j'ai corrigé les problèmes existant, et après test çà fonctionne bien. Par contre si on réteind la machine tout de suite derrière, quand on relance un "Wake Up" celle-ci ne se rallume pas... a voir !

    Dite moi si çà fonctionne chez vous !

  • signaler à un administrateur
    Commentaire de Also know as le 29/08/2006 13:57:04

    Par contre un tel programme peut augmenter votre factures EDF :-) ==> Je pense que tu sais très bien qu'un PC ne consomme pratiquement rien. Cela ne participe (mais participe quand même) que peu à la facture EDF de ta maison. Ton frigo utilise plus de ressource que lui ;-)

    Mais bon celà n'a rien à voir avec la source, vraiment dommage que je puisse pas la tester cette source, et puis je pourrait même pas regrader la source si c'est poru hallucinner 3h devant sans rien comprendre :-D

  • signaler à un administrateur
    Commentaire de elguevel le 29/08/2006 14:19:31

    L'histoire de la facture EDF, c'est de l'humour .. mais tu sait la consomation dépend aussi de ta configuration, donc çà dépend (y'en à qui sont mieux équipé que des réfrigirateur) !

    Sinon pourquoi ne peux tu pas tésté le WakeOnLAN chez toi ? Matos trop obsolète ?

  • signaler à un administrateur
    Commentaire de Also know as le 29/08/2006 15:05:28

    Exact !

    Mon bios ne me permet pas de faire un WOL donc je ne peux pas tester cela correctement.

    Et je n'ai pas d'autre PC à l'horizon pour tester cela.

    Désolé

  • signaler à un administrateur
    Commentaire de elguevel le 29/08/2006 15:12:54

    Dommage, personne pourra me tester mon appli alors :-)

  • signaler à un administrateur
    Commentaire de Also know as le 29/08/2006 15:32:25

    Mais simais si ^^
    Le problème c'est que les autres personnes ne se rendent pas compte de l'utilité de cet executable.
    Moi j'enaurais bien l'utilité mais tant pis pour moi.

  • signaler à un administrateur
    Commentaire de elguevel le 29/08/2006 15:51:48

    Je sais pas si c'est vraiment utile, au pire je peux y coupler avec un serveur Web afin de pouvoir démarrer son PC de n'importe où sur internet ...

    Mais ce qui est frustrant avec ce genre de source, c'est que çà peux très bien fonctionner chez moi et pas chez certains, et afin de voir ce qui va ou ne va pas... j'ai besoin de la communauté :-)

  • signaler à un administrateur
    Commentaire de f0xi le 29/08/2006 18:03:39 administrateur CS

    bah y'a un truc aussi, est-ce que ça fontionne sur reseaux routé ?

    car le routeur a sa propre adresse mac et peu egalement offrir des services WOL parametrable (routeur qui coute cher).

    le truc etant de savoir si le routeur ne contient pas un IDS agressif qui bloque les messages WOL, ou si il n'est pas paramétrés pour les bloquer.

    Ensuite, toutes les CM ne fournisse pas les PME et certaines config n'ont pas été prevus pour, CAD le cable WOL n'est pas relié a la CM.

    Mais ça reste toujours trés interressant d'un point de vus analyse de paquets et recuperation de la MAC.

    Ensuite pour faire les tests, il faut deux machine reliées en reseaux et tester les fonctionnement avec diverse config (connexion par simple cable, switch, routeur ect...)

    de plus, je crois qu'il y a un delai a respecter entre l'envois de deux evenements.
    voir egalement les interractions entre les PME et la config BIOS en cas de coupure de courant (Stay off).

    bref ... pas mal de tests et de boulot en perspectives.

  • signaler à un administrateur
    Commentaire de f0xi le 29/08/2006 19:57:49 administrateur CS

    tiens je t'ai refait quelques methodes performantes et clean pour manipuler les adresses mac et pour ameliorer celles de l'unitée Elg-WOL



    type
      TMacAddress = array[0..5] of byte;
      TMagicPack  = array[0..101] of byte;

    // Adresse mac vers chaine
    function MacToStr(const MacAddress : TMacAddress; const Delimiter : char = '-') : string;
    var   PResult : PChar;
          i : integer;
    const Digits: array[0..15] of Char = '0123456789abcdef';
    begin
      // une adresse MAC fait 17 caracteres de long
      SetLength(Result, 17);
      PResult := PChar(Result);

      for I := 0 to 5 do begin
          // on convertis l'octet en texte
          PResult[0] := Digits[MacAddress[I] shr 4];
          PResult[1] := Digits[MacAddress[I] and $F];
          // on ajoute un delimiteur ou non
          if i < 5 then begin
             PResult[2] := Delimiter;
             Inc(PResult,3);
          end else
             Inc(PResult,2);
      end;
    end;

    // Interne, supprime le caractere 'chartoremove' de la chaine 's'
    function DeleteChar(const S : string; const CharToRemove : char) : string;
    var  pR  : PChar;
         L,I : integer;
    begin
      SetLength(Result, length(S));
      pR := PChar(Result);
      L  := 0;
      for i := 1 to Length(S) do
        if s[i] <> CharToRemove then begin
           pR[0] := s[i];
           Inc(pR);
           Inc(L);
        end;
      SetLength(Result,L);
    end;

    // transforme une chaine representant une adresse MAC (ff-aa-cc-dd-ee-56) vers un TMacAddress
    procedure StrToMac(var MacAddress : TMacAddress; const MacStr : string; const Delimiter : char = '-');
    var i : integer;
        s : string;
        b1,b2 : byte;
    begin
      // on supprime le delimiteur
      s := DeleteChar(MacStr,Delimiter);
      // si la longeur est differente de 12 c'est qu'il y a un probleme
      if Length(S) <> 12 then
         exit;
      for i := 0 to 5 do begin
          // on recupere la valeur ordinal du caractere et on decremente pour obtenir une valeur
          // entre 0 et 15
          // shl 1 = *2 , un decalage est plus rapide qu'une multiplication
          b1 := Ord(s[(i shl 1) + 1]) - 48;
          b2 := Ord(s[(i shl 1) + 2]) - 48;
          if b1 > 15 then dec(b1,39);
          if b2 > 15 then dec(b2,39);

          MacAddress[i] := (b1 shl 4) + (b2 and $F);
      end;
    end;


    // convertis un MagicPack vers une liste de chaines
    procedure MagicPackToStrings(const MagicPack : TMagicPack; Strings : TStrings);
    var i  : integer;
        MA : TMacAddress;
    begin
      Strings.BeginUpdate;
      for i := 0 to 16 do begin
          // on copie directement 6 octets de la memoire a partir de l'index i*6 dans MA
          Move(MagicPack[i*6],MA,6);
          // puis on utilise MacToStr pour convertir la chaine
          Strings.Add(MacToStr(MA,' '));
      end;
      Strings.EndUpdate;
    end;


    // cree un MagicPack a partir d'une adresse MAC (TMacAddress)
    procedure CreateMagicPack(const MacAddress : TMacAddress; var MagicPack : TMagicPack);
    var i : integer;
    begin
      // on remplis les 6 premier octets avec $FF
      for i := 0 to 5 do
          MagicPack[i] := $FF;

      // on copie 16 fois les 6 octets de MacAddress dans MagicPack a l'index i*6
      for i := 1 to 16 do
          Move(MacAddress, MagicPack[i*6],6);
    end;

  • signaler à un administrateur
    Commentaire de f0xi le 29/08/2006 20:11:43 administrateur CS

    ce qui reduit la procedure GoWOL


    procedure GoWOL(const sAdresseMac : string );
    var
      StructWSA : WSAData;
      Sckt      : Integer;
    Sckaddrin : sockaddr_in;
      MagicPack : TMagicPack;
      MagicLen  : integer;
      ArrayMac  : TMacAddress;
      OptionVal : Integer;
    begin
      OptionVal := 1;
      FillChar( sckaddrin, SizeOf( sckaddrin ), #0 );

      StrToMac(ArrayMac,sAdresseMac);
      CreateMagicPack(ArrayMac,MagicPack);
      MagicLen := 102;

      try
       if ( WSAStartup( MAKEWORD(2, 2), StructWSA ) = 0 ) then begin

          Sckt := Socket( AF_INET, SOCK_DGRAM, IPPROTO_IP );

       if ( Sckt <> INVALID_SOCKET ) then begin

       Sckaddrin.sin_family      := AF_INET;
       Sckaddrin.sin_addr.s_addr := Longint( INADDR_BROADCAST );
            Sckaddrin.sin_port        := htons( 666 );

            setsockopt( Sckt, SOL_SOCKET, SO_BROADCAST, PChar(@OptionVal), SizeOf(OptionVal) );

       if ( connect( Sckt, Sckaddrin, 16 ) < 0 ) then begin
               MessageBoxA( 0, PChar('Impossible de se connecter'), PChar('Stop'), MB_ICONWARNING );
               Exit;
       end;

       sendto( Sckt, MagicPack, MagicLen, 0, Sckaddrin, SizeOf(Sckaddrin) );

       closesocket( Sckt );
       end else
            MessageBoxA( 0, PChar('Impossible de créer la socket'), PChar('Stop'), MB_ICONWARNING );
        end else
            MessageBoxA( 0, PChar('Impossible d''initialiser la socket'), PChar('Stop'), MB_ICONWARNING );
      finally
        WSACleanup;
      end;
    end;

  • signaler à un administrateur
    Commentaire de f0xi le 29/08/2006 20:34:52 administrateur CS

    passont a ElgRegistre

    quelques corrections a faire, il faut toujours penser a la souplesse et ne jamais utiliser la classe qui contient l'objet visé par une methode (Listbox > TStrings)

    on declare donc ElgRegistre de cette façon :

    // renvois true sir l'action c'est bien deroulée sinon false
    function EcritListe(Strings : TStrings) : boolean;
    function LireListe (Strings : TStrings) : boolean;

    implementation

    const
      MORPHEE_LIST_KEY    = 'Software\Elguevel\Morphee\';

    function EcritListe(Strings : TStrings) : boolean;
    var
        I : Integer;
    begin
      result := false;
      with TRegistry.Create do begin
        try
           RootKey := HKEY_CURRENT_USER;

           // plus rapide, on efface directement la clef
           if KeyExists(MORPHEE_LIST_KEY) then
              DeleteKey(MORPHEE_LIST_KEY);

           // on precise bien True pour CanCreate
           // on verifie toujours que la clef est bien ouverte pour faire les manips.
           if OpenKey(MORPHEE_LIST_KEY, True) then begin
              for I := 0 to Strings.Count-1 do
                  WriteString(IntToStr(I), Strings.Strings[I]);
              // on declare CloseKey ici bien qu'il n'y ai pas d'erreur de le mettre
              // dans le finally, mais c'est inutile en cas d'erreur.
              CloseKey;
              result := true;
           end;
        finally
          Free;
        end;
      end;
    end;

    function LireListe(Strings : TStrings) : boolean;
    var
        I : Integer;
    begin
      result := false;
      with TRegistry.Create do begin
        try
           RootKey := HKEY_CURRENT_USER;
           // on ne crée pas la clef ici, si elle est vide ça ne sert a rien d'aller plus loin.
           if OpenKey(MORPHEE_LIST_KEY, false) then begin
              Strings.BeginUpdate;
              Strings.Clear;
              // on utilise directement Strings, pas besoin d'une liste temporaire
              GetValueNames( Strings );
              Strings.EndUpdate;
              CloseKey;
              result := true;
           end;
        finally
          Free;
        end;
      end;
    end;



    on modifie en consequence dans l'unité Main :

    LireListe( ListMAC.Items );
    EcritListe( ListMAC.Items );

    on peu bien sur utiliser le retour des fonctions pour transmettre des messages de succés/echec a l'utilisateur.

  • signaler à un administrateur
    Commentaire de 365tib le 29/08/2006 23:55:21

    Vous allez dire que je suis nul...

    mais qu'est qui alimente la carte réseau???
    Et est-que sa marche aussi avec les dongles wifi??
    Tu dit qu'il faut modifier le BIOS??

    si tu peut m'éclairé...

    merci

  • signaler à un administrateur
    Commentaire de elguevel le 30/08/2006 08:07:40

    Un grand MERCI à fOxy : Tu as transformé mes fonctions toutes pourris en quelque chose de potable, je vais allé mettre çà a jour (et faire quelques modif au passage pour rendre le programme plus pratique).

    365tib > Pour ce qui est du WiFi j'en sait rien, c'est une technologie à laquel je ne suis pas encore passé et qui ne m'interesse pas plus que çà. Et la carte réseau est normalement alimenté par la carte mère, mais là aussi coté HardWare je ne peux pas te répondre avec certitude ...  

  • signaler à un administrateur
    Commentaire de elguevel le 30/08/2006 08:12:04

    Ah oui et puis pour le BIOS, si ta carte mère supporte biensure, il faut activer le Wake On LAN. Dans le BIOS il y à un menu alimentation,  tu doit avoir en toute lette Wake On LAN, ba tu y active (Enabled).

  • signaler à un administrateur
    Commentaire de elguevel le 30/08/2006 10:12:38

    Voila fOxy j'ai mis en place les modifications que tu m'as faite, vraiment sympa :-)

    Par contre tu t'es planté sur un truc, c'est pour recharger la liste via le registre.
    Tu m'as corrigé en me donnant çà :

    // on utilise directement Strings, pas besoin d'une liste temporaire
    GetValueNames( Strings );

    Mais en faite non, car dans ce cas je récupère les clés (0, 1, 2..) et non les valeurs (adresse MAC).

    J'ai donc laissé mon système de liste temporaire (TStringList).

    Aller Merci Bcp !!!

  • signaler à un administrateur
    Commentaire de f0xi le 30/08/2006 22:14:37 administrateur CS

    Ah oui, au temps pour moi pour le registre, la fatigue et le pas de tests surrement ^^

    par contre un truc qui n'a rien a voir, tu ecrit :

    Par :
    LEVEUGLE Damien
    fOxy [ http://www.delphifr.com/auteurdetail.aspx?ID=360948 ]

    on vas croire que c'est toi f0xi :)

    faut ecrire :

    auteur principal : Leveugle Damien - Elguevel - www.delphifr.com
    Co-auteur & code additionnel : f0xi - www.delphifr.com

  • signaler à un administrateur
    Commentaire de elguevel le 30/08/2006 23:02:10

    Arf merde... j'enchaine les boulettes en ce moment, mais j'ai mis ton nom en remerciement dans la fenetre de Crédit. Je corrigerai çà demain.

    Sinon merci pour avoir pris le temps d'optimiser mes fonctions, je les trouvent nettement plus jolie (surtout tout tes algos mathématiques auquelles je n'accorde jamais assez d'importance). Et tu es mille fois excusé quant au "GetValueNames".

    A chaque nouveau developpement je retiens néanmoins tes conseil ; par exemple ici tu remarquera que j'ai utilisé "Close" et non "Application.Terminate" comme tu me l'avais suggéré.

    Sinon comme d'habitude je m'apperçois que les sources réseaux n'interesse pas grand monde, pourtant c'est passionant le réseau non :-) ?

    Allé hop, je vais commencer à me pencher sur un autre code ...

  • signaler à un administrateur
    Commentaire de Francky23012301 le 31/08/2006 00:29:23

    Salut Elguevel,

    "Sinon comme d'habitude je m'apperçois que les sources réseaux n'interesse pas grand monde, pourtant c'est passionant le réseau non :-) ?" si si mais on en reste bouche bez

    Je n'ai pas testé ton code : Arfff mon pc ne le permet pas.

    Par contre ca m'a permis de m'interesser à un truc que je connaissais tres peu : Merci Elguevel.

    Coté code : Nickel sauf un petit truc : il y a des fonctions assez spéciales (car c'est du réseau ^^) qui mériteraient peut etre d'etre commentées.

    Allez un bon 9/10 pour ton taff ;).

  • signaler à un administrateur
    Commentaire de elguevel le 31/08/2006 08:14:31

    Merci Francky23012301, toujours là pour me soutenir :-)

    Sinon je reposterai un nouveau code, je sais pas quand mais j'améliorerai la lisibilité.

    Par contre je suis surpris que tout le monde me dise "mon pc ne le permet pas"... c'est pourtant pas si récent que çà ?

  • signaler à un administrateur
    Commentaire de Pierre42 le 07/11/2006 14:48:18

    Bonjour,

    J'ai testé le systeme sur mon reseaux de 20 machines, ca marche nickel a une exeption pres lorsque je fait un copié coller de la procedure SendARP dans mon programme j'ai un message d'erreur lors de la recompilation

    Felicitation

  • signaler à un administrateur
    Commentaire de elguevel le 07/11/2006 15:23:56

    La fonction est la suivante :

    function  SendARP( const DestIP: DWORD; const SrcIP: DWORD; const pMacAddr: PULONG; const PhyAddrLen: PULONG ) : DWORD; stdcall; external 'IPHLPAPI.DLL';

    Elle permet de remonter des informations (adresse IP) en fonction de l'adresse MAC, en envoyant tout simplement une requete ARP.

    La fonction déconne effectivement si l'adresse MAC n'existe pas sur le reseau, sinon comme çà je ne pourrai pas vous dire. Quel erreur avez vous exactement ?

    PS : Sinon ce programme est la démo CodeSource, l'application complète se trouve sur Telecharger.com - Logiciel : "Morphee"

    Merci

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS