*! * Subject: Starting a remote machine *! * * Author: C. Chenavier *! * * Version: 1.00 - 31/05/2005 *! * *! * The Wake-up frame is a particular data flow formed *! * Of at least 16 times repetition of the Ethernet address *! * Remote machine, preceded by a synchronization stream * "* 6-byte value of 255. *! * *! * If the Ethernet address of the remote computer is 01:02:03:04:05:06 (6 bytes) *! * Then the LAN controller of this machine is waiting for the following sequence: *! * FFFFFFFFFFFF010203040506010203040506010203040506010203040506 *! * 010203040506010203040506010203040506010203040506010203040506 *! * 010203040506010203040506010203040506010203040506010203040506 *! * 010203040506010203040506 *! * *! * * Example of use: *! * *! * = M.lOK Wakeup ("000b6ab505a6", "192168192255") FUNCTION WakeUp LPARAMETERS cMacAddress, nPort, cIP 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 type, INTEGER 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 level, INTEGER optname, STRING @ optval, INTEGER optlen DECLARE INTEGER sendto IN WS2_32.DLL; INTEGER s, STRING @ buf, INTEGER buflen, INTEGER flags, STRING @ 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))