Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.19;
Скачать: CL | DM;

Вниз

Wake up on Lan   Найти похожие ветки 

 
Dmitry V. Averuanov   (2003-10-23 15:40) [0]

- Существует ли реализация из Delphi ?
- ПРимерчик бы......


 
zapped   (2003-10-23 21:30) [1]

теоретическая часть (взято некоторое время назад на каком-то форуме):

У каждой сетевой карты с WOL есть свой уникальный номер, и если сетевой карте послать специальный пакет, то она включит кнмпьютер.
Необходимые условия:
Материнская плата и сетевая карта должны держать WOL
Блок питания ATX должен быть ЭЛЕКТРОННО выключен (а не из розетки)
В BIOS-SETUP надо включить опцию Wake On Lan
Теперь насчет специального пакета. Он состоит из
1)6-и байт синхронизации (0FFh)
2)6 раз уникальный адрес сетевой карты компьютера, который надо включить.

Пример: Если сетевая карта имеет номер 01:02:03:04:05:06, то пакет выглядит так
"FF FF FF FF FF FF 01 02 03 04 05 06 01 02 03 04 05 06 01 02 03 04 05 06 01 02 03 04 05 06 01 02 03 04 05 06 01 02 03 04 05 06"

Узнать номер сетевой можно посмотрев в свойствах соединения (WINXP) или намеренно поставив такой же TCP/IP адрес как и у другой сетевой дождаться сообщения о конфликте такового. Там будет указан и уникальный номер той самой другой сетевой (WIN98/WINME).


Узнать MAC ещё можно по-другому - программно
вот модуль (не мой, где-то в нете нашёл)

{
*** Get MAC Adress ***
*** by Filip Skalka, fip@post.cz ***
*** September 2002 ***
}

unit MACAdress;

interface

uses Classes;

function GetMACAddresses(const Adresses: TStringList;
const MachineName: string = ""): integer;
function GetMACAddress(const MachineName: string = ""): string;

implementation

uses NB30,sysutils;

type
ENetBIOSError=class(Exception);

function NetBiosCheck(const b:char):char;
begin
if b<>chr(NRC_GOODRET) then raise ENetBIOSError.create("NetBios error"#13#10"Error code "+inttostr(ord(b)));
result:=b;
end;

function AdapterToString(const Adapter:PAdapterStatus):string;
begin
with Adapter^ do Result :=Format("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x",[Integer(adapter_address[0]),Integer(adapter_address[1]),Integer(adapter_ address[2]), Integer(adapter_address[3]),Integer(adapter_address[4]), Integer(adapter_address[5])]);
end;

procedure MachineNameToAdapter(Name:string;var AdapterName:array of char);
begin
if Name="" then Name:="*" else Name:=ansiuppercase(Name);
Name:=Name+StringOfChar(" ",length(AdapterName)-Length(Name));
move(Name[1],AdapterName[0],length(AdapterName));
end;

function GetMACAddresses(const Adresses:TStringList;const MachineName:string=""):integer;
var i:integer;
NCB: PNCB;
Adapter:PAdapterStatus;
Lenum:PLanaEnum;
RetCode:char;
begin
Adresses.clear;

New(NCB);
New(Adapter);
New(Lenum);
try
Fillchar(NCB^,SizeOf(TNCB),0);
fillchar(Lenum^,SizeOf(TLanaEnum),0);
NCB.ncb_command:=chr(NCBENUM);
NCB.ncb_buffer:=Pointer(Lenum);
NCB.ncb_length:=SizeOf(Lenum);
NetBiosCheck(Netbios(NCB));
result:=ord(Lenum.Length);

for i:=0 to result-1 do
begin
Fillchar(NCB^,SizeOf(TNCB),0);
Ncb.ncb_command:=chr(NCBRESET);
Ncb.ncb_lana_num:=lenum.lana[i];
NetBiosCheck(Netbios(Ncb));

FillChar(NCB^,SizeOf(TNCB),0);
FillChar(Adapter^,SizeOf(TAdapterStatus),0);

Ncb.ncb_command:=chr(NCBASTAT);
Ncb.ncb_lana_num:=lenum.lana[i];
MachineNameToAdapter(MachineName,Ncb.ncb_callname);
Ncb.ncb_buffer:=Pointer(Adapter);
Ncb.ncb_length:=SizeOf(TAdapterStatus);
RetCode:=Netbios(NCB);
if RetCode in [chr(NRC_GOODRET),chr(NRC_INCOMP)] then Adresses.add(AdapterToString(Adapter));
end;
finally
Dispose(NCB);
Dispose(Adapter);
Dispose(Lenum);
end;
end;

function GetMACAddress(const MachineName:string=""):string;
var
SL: TStringList;
begin
SL := TStringList.Create;
try
if GetMACAddresses(SL, MachineName) = 0 then
Result := ""
else
try
Result := SL.Strings[0];
except
Result := "";
end;
finally
SL.Free;
end;
end;

end.


как послать широковещательное сообщение (только я её ещё не пробовал):

procedure ...
var
Init: TWSAData;
SockOpt: BOOL;
Sock: TSocket;
Target: TSockAddrIn;
begin
WSAStartup($101,Init);
Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
SockOpt:=TRUE;
SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST, PChar(@SockOpt),SizeOf(SockOpt)) ;
Target.sin_port:=htons(8167); //номер порта
Target.sin_addr.S_addr:=INADDR_BROADCAST;
Target.sa_family:=AF_INET;
SendTo(Sock,Data,DataBytes,0,Target,SizeOf(Target));
WSACleanup;
end;



Страницы: 1 вся ветка

Текущий архив: 2003.12.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
3-61902
Murad
2003-11-27 12:03
2003.12.19
Backup в MSSql


3-61979
Крутыш
2003-11-23 12:46
2003.12.19
Проблемы c Post


1-62056
IgoX
2003-12-05 18:56
2003.12.19
Как прочесть весь документ Word в String


3-61974
GIL
2003-11-25 16:39
2003.12.19
Русские буквы


3-61906
Siv Soft
2003-11-20 17:50
2003.12.19
IBClientDataSet - не загружает данные, не обновляет записи