ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Démarrage d'une machine à distance   



L'auteur

Christophe Chenavier
France France
Membre Simple
# 0000000023
enregistré le 14/10/2004
http://www.corwin.fr
58 ans
CHENAVIER Christophe
80440 BOVES
de la société Corwin
Fiche personnelle


Note des membres
20/20
2 votes


Contributions > 05 - API et appels systèmes > IP

Démarrage d'une machine à distance
# 0000000200
ajouté le 31/05/2005 15:24:57 et modifié le 07/06/2005
consulté 10279 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0

Description

Cette fonction permet de démarrer une machine à distance (pour peu que le BIOS de cette machine soit configuré pour le Wake-On-LAN). Elle nécessite de connaître l'adresse MAC de la machine et l'adresse IP de Broadcast.

La trame de démarrage est un flux de données particulier formé d'au moins 16 fois la répétition de l'adresse Ethernet de la machine distante et précédé par un flux de synchronisation de 6 octets de valeur 255.
Si l'adresse Ethernet de l'ordinateur distant est 01:02:03:04:05:06 (6 octets), alors le controleur LAN de cette machine est en attente de la séquence suivante :
FFFFFFFFFFFF010203040506010203040506010203040506010203040506
010203040506010203040506010203040506010203040506010203040506
010203040506010203040506010203040506010203040506010203040506
010203040506010203040506

Code source :
*!* Objet : Démarrage d'une machine à distance
*!* Auteur : C.Chenavier
*!* Version : 1.00 - 31/05/2005
*!*
*!* La trame Wake-up est un flux de données particulier formé
*!* d'au moins 16 fois la répétition de l'adresse Ethernet de la
*!* machine distante et précédé par un flux de synchronisation
*!* de 6 octets de valeur 255.
*!*
*!* Si l'adresse Ethernet de l'ordinateur distant est 01:02:03:04:05:06 (6 octets),
*!* alors le controleur LAN de cette machine est en attente de la séquence suivante :
*!*   FFFFFFFFFFFF010203040506010203040506010203040506010203040506
*!*   010203040506010203040506010203040506010203040506010203040506
*!*   010203040506010203040506010203040506010203040506010203040506
*!*   010203040506010203040506
*!*
*!* Exemple d'utilisation :
*!*
*!* M.lOK = Wakeup("000b6ab505a6","192.168.192.255")


FUNCTION WakeUp

LPARAMETERS cMacAddress, cIP, nPort

LOCAL I, lOK, cMagic, cBuff, nSocketHandle, cPort

#DEFINE AF_INET      2
#DEFINE SOCK_DGRAM    2
#DEFINE IPPROTO_UDP    17
#DEFINE SOCKET_ERROR  -1
#DEFINE SOL_SOCKET      0xFFFF
#DEFINE  SO_BROADCAST  0x20

M.cMacAddress = CHRTRAN(M.cMacAddress, ":- "'')
M.cMagic = REPLICATE("FF",6)+REPLICATE(M.cMacAddress,16)
M.cBuff = ''
FOR I = 1 TO LEN(M.cMagic) STEP 2
    M.cBuff = M.cBuff + CHR(HexaToDeci(SUBSTR(M.cMagic, I, 2)))
ENDFOR

DECLARE INTEGER WSAStartup IN WS2_32.DLL ;
        INTEGER wVersionRequested, STRING lpWSAData

DECLARE INTEGER socket IN WS2_32.DLL ;
        INTEGER af, INTEGER typeINTEGER protocol

DECLARE INTEGER htons IN WS2_32.DLL ;
        INTEGER hostshort

DECLARE INTEGER inet_addr IN WS2_32.DLL ;
         STRING cp

DECLARE INTEGER setsockopt IN WS2_32.DLL ;
        INTEGER s, INTEGER levelINTEGER optname, STRING @ optval, INTEGER optlen

DECLARE INTEGER sendto IN WS2_32.DLL;
        INTEGER s, STRING @ buf, INTEGER buflen, INTEGER flagsSTRING @ sockaddr, INTEGER addrlen

DECLARE INTEGER closesocket IN WS2_32.DLL ;
        INTEGER s

DECLARE INTEGER WSACleanup IN WS2_32.DLL

IF WSAStartup(0x202, REPLICATE(CHR(0),512)) = 0          && initialisation Winsock
   M.nSocketHandle = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)  && création du socket UDP
   IF M.nSocketHandle <> SOCKET_ERROR
      M.cPort = WordToStr(htons(IIF(EMPTY(M.nPort), 9, M.nPort)))
      M.cIP = dWordToStr(inet_addr(M.cIP))
      M.cRemoteAddr = WordToStr(AF_INET) + M.cPort + M.cIP + REPLICATE(CHR(0),8)
      M.cOptval = REPLICATE(CHR(255),4)
      M.nResult = setsockopt(M.nSocketHandle, SOL_SOCKET, SO_BROADCAST, @cOptval, LEN(M.cOptval))    && mode broadcast
      IF M.nResult <> SOCKET_ERROR
         M.nResult = sendto(M.nSocketHandle, @cBuff, LEN(M.cBuff), 0, @cRemoteAddr, LEN(cRemoteAddr))  && envoi de la trame
         M.lOK = (M.nResult <> SOCKET_ERROR)
      ENDIF
      =closesocket(M.nSocketHandle)
   ENDIF
   WSACleanup()
ENDIF

CLEAR DLLS WSAStartup, socket, htons, inet_addr ;
           setsockopt, sendto, closesocket, WSACleanup


RETURN M.lOK



*---------------------------------------------------------------- dWordToStr

FUNCTION dWordToStr

LPARAMETER nValeur

LOCAL nB0, nB1, nB2, nB3

IF M.nValeur < 0
   M.nValeur = 2^32 + M.nValeur
ENDIF
M.nB3 = BITRSHIFT(M.nValeur, 24)
M.nB2 = BITRSHIFT(M.nValeur - M.nB3*2^24, 16)
M.nB1 = BITRSHIFT(M.nValeur - M.nB3*2^24 - M.nB2*2^16, 8)
M.nB0 = MOD(M.nValeur, 2^8)

RETURN CHR(M.nB0)+CHR(M.nB1)+CHR(M.nB2)+CHR(M.nB3)


*---------------------------------------------------------------- WordToStr

FUNCTION WordToStr

LPARAMETER nValeur

RETURN CHR(MOD(nValeur,256)) + CHR(INT(nValeur/256))


*---------------------------------------------------------------- HexaToDeci

FUNCTION HexaToDeci

LPARAMETERS cHexa

RETURN EVALUATE("0x"+ALLTRIM(M.cHexa))


Commentaires
le 06/06/2005, Arconnerie a écrit :
Salut,

Tu la trouves où la fonction "HexaToDeci"??
Merci et A+

le 07/06/2005, Christophe Chenavier a écrit :
Oubli réparé !
le 14/02/2007, Olivier Hamou a écrit :
Bravo !!!!
le 18/06/2008, ybenam a écrit :
Tout cela est merveilleux !
Mais qui allume le bouton d'électricité ?
Je conçois que la machine soit en attente ....


Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3