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 !

ALLUMER UNE MACHINE DANS UN RÉSEAU (WAKE ON LAN)


Information sur la source

Catégorie :Réseau & Internet Classé sous : Wakeonlan, WOL, réveiller, réveil, wake Niveau : Initié Date de création : 18/01/2008 Vu : 8 003

Note :
8 / 10 - par 3 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Un wake on lan que j'ai déjà publié sur le forum.
Je pense qu'il sera plus visible ici vu les difficultés que j'ai eu à trouver des renseignements pour ecrire cette source en php.
Le principe :
On ouvre une socket sur le réseau et on broadcast FF FF FF FF FF FF + 16 * l'adresse mac de la machine à réveiller

 

Source

  • <?php
  • class Wol{
  • private $nic;
  • public function wake($mac){
  • $this->nic = fsockopen("udp://255.255.255.255", 9);
  • if( !$this->nic ){
  • fclose($this->nic);
  • return false;
  • }
  • else{
  • fwrite($this->nic, $this->pacquet($mac));
  • fclose($this->nic);
  • return true;
  • }
  • }
  • private function pacquet($Mac){
  • $packet = "";
  • for($i = 0; $i < 6; $i++){$packet .= chr(0xFF);}
  • for ($j = 0; $j < 16; $j++){
  • for($i = 0; $i < 12; $i=$i + 2){$packet .= chr(hexdec(substr($Mac, $i, 2)));}
  • }
  • return $packet;
  • }
  • }
  • $wol = new Wol();
  • // Remplacer 001122334455 par l'adresse mac du pc à allumer
  • $wol->wake('001122334455');
  • ?>
<?php 

 class Wol{
   private $nic;
     public function wake($mac){ 
         $this->nic = fsockopen("udp://255.255.255.255", 9); 
         if( !$this->nic ){ 
             fclose($this->nic); 
             return false; 
         } 
         else{ 
             fwrite($this->nic, $this->pacquet($mac)); 
             fclose($this->nic); 
             return true; 
         } 
     } 
 
     private function pacquet($Mac){ 
         $packet = ""; 
         for($i = 0; $i < 6; $i++){$packet .= chr(0xFF);} 
         for ($j = 0; $j < 16; $j++){
          for($i = 0; $i < 12; $i=$i + 2){$packet .= chr(hexdec(substr($Mac, $i, 2)));} 
         }
         return $packet; 
     } 
 } 

 $wol = new Wol();   
//   Remplacer    001122334455   par l'adresse mac du pc à allumer         
 $wol->wake('001122334455');      

?> 

Conclusion

Cette source est écrite en php5 mais si on supprime les "Public/Private" ... on se retrouve en php4.

 

Commentaires et avis

signaler à un administrateur
Commentaire de yoman64 le 18/01/2008 10:45:28 7/10

Salut,

Cette source est intéressante et je ne me souviens pas en avoir déja vu une de ce genre ici :).

Juste deux petites remarques:

Ici: for($i = 0; $i < 6; $i++){$packet .= chr(0xFF);}
Pourquoi faire un for, c'est pas très utile il me semble qu'un $packet = "\xFF\xFF\xFF\xFF\xFF\xFF"; suffierait emplement.

Et une gestion au moin minimal des erreurs serait bien, vérification si le mac est valide, si le socket s'ouvre bien.

@+

signaler à un administrateur
Commentaire de olbou621 le 18/01/2008 11:33:18

Bonjour,

Je suis tout à fait d'accord avec toi. Il y aurait beaucoup à dire sur cette source mais son but est avant tout de donner quelque chose qui fonctionne.
Le principe du wake on lan en php si tu veux.
Charge reste à l'utilisateur d'adapter et de gérer les erreurs.

@+

signaler à un administrateur
Commentaire de yoman64 le 18/01/2008 13:22:03

Au passage je te pris de m'escuser tu vérifie bien si le socket s'ouvre, j'avais pas fait attention :).

signaler à un administrateur
Commentaire de jantosze le 19/01/2008 14:34:30

Salut,

Sujet intéressant. Au même titre du contrôle de l'ouverture de la socket, avant je ferai un test sur la longueur de la mac adresse en cas d'erreur de saisie.

cdt
JAN

signaler à un administrateur
Commentaire de valneandre le 21/01/2008 09:00:50 7/10

Intéressante ressource système, ça change un peu des bouts de code frimeurs qui nous arrivent en surnombre.
merci.
Valnéandre

signaler à un administrateur
Commentaire de yuuzhantar le 22/01/2008 21:17:38 10/10

Salut

je ne savais pas qu'on pouvais faire des sockets en php
tu viens de m'apprendre quelque chose

merci

signaler à un administrateur
Commentaire de herrads le 30/01/2008 18:01:47

je viens de le voir. Je l'ai souvent plutôt fait en batch
Merci de l'info

signaler à un administrateur
Commentaire de lassie14 le 04/02/2008 19:53:24

je n'arrive pas a faire marcher ta source
je l'ai essayez chez free il sont en php 4 j'ai donc enlever les private et public
ça marchait toujours pas j'ai donc supprimer la classe et enlever tous ce qui faut
et maintenantj'ai une erreur a l'ouverture du socket:
Warning: fsockopen() [function.fsockopen]: unable to connect to 255.255.255.255:9 in /mnt/129/sdc/8/1/****/wake.php on line 5

Warning: fclose(): supplied argument is not a valid stream resource in /mnt/129/sdc/8/1/******/wake.php on line 7

signaler à un administrateur
Commentaire de olbou621 le 05/02/2008 08:04:37

Cette source est destinée à un lan. Sur internet, (chez FREE par exemple) il est probable que l'adresse 255.255.255.255 soit bloquée.
Les trames ont dèjà beaucoup de mal à passer un simple routeur ... alors chez un hebergeur, je pense que cela ne peut pas aller bien loin.

@+

signaler à un administrateur
Commentaire de starfix2006 le 30/05/2008 09:49:58

On arrive à des trucs pas trop mal chez Free en se creusant un peu la tête...
Pour preuve: http://wakeonwan.free.fr

signaler à un administrateur
Commentaire de olbou621 le 30/05/2008 18:34:20

Génial

édite le code source et je t'édite un billet de 5 euros !

signaler à un administrateur
Commentaire de Crafty57 le 31/05/2008 15:22:00

Salut,

Je trouve ton code super intéressant.
Je viens de le tester dans une application que je développe.

Par contre je ne comprends pas cette partie :

for($i = 0; $i < 6; $i++){    
    $packet .= chr(0xFF);
}                            

A quoi sert la fonction chr ? J'ai regarder sur PHP.net mais j'ai pas compris :s
Pourquoi 0xFF ? Ca correspond à quoi ?

Merci d'avance :)

signaler à un administrateur
Commentaire de olbou621 le 31/05/2008 17:07:42

salut,

CHR(num) est une fonction qui revoie le caractère correspondant au chiffre "num".

Exemple chr(0x41) retourne A chr(0x42) retourne B  ... etc

0xFF cad FF en hexa c'est ... 255 en décimale

chr(0xFF) me permet d'inscrire dans une chaine le caractère FF (255 de la table ascii). Caractère qui n'est pas imprimable.

Pourquoi écrire le caractère FF. Je te conseil de visité le site de wikipédia au sujet du wake on line http://fr.wikipedia.org/wiki/Wake-on-LAN .

Bon courage

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Wake on lan [ par Elektordi ] Est-ce que quelqu'un sait commant allumer un PC a distance (qui supporte le WOL) via une interface PHP tournant sur un serveur siué sur le même réseau


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.