Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wake on LAN Problem :-( (https://www.delphipraxis.net/116214-wake-lan-problem.html)

paritycheck 25. Jun 2008 10:28

Re: Wake on LAN Problem :-(
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte vor einiger Zeit auch mal ein solches Tool geschrieben. Ich hängs einfach mal dran, vielleicht kannst Du ja was damit anfangen.

Gruß
Michael

TimmA 1. Jul 2008 07:38

Re: Wake on LAN Problem :-(
 
danke dir, habs mitlerweile auch hinbekommen! :-)

eine frage noch, ich hätte gerne einen status angezeigt von dem rechner den ich "wecken" will. also ob er an ist oder aus. und das in einer grafik wiedergeben.
wie kann ich das am einfachsten realisieren? habe mich schon mal hier im forum umgeschaut ob man evtl. den rechner anpingen kann und das dann auswerten ob er antwortet oder nicht, oder geht das irgendwie viel einfacher?

rollstuhlfahrer 1. Jul 2008 08:59

Re: Wake on LAN Problem :-(
 
Anpingen könnte zu Problemen führen, wenn die Netzwerkkarte noch keine IP-Adresse hat, was leider der Standartzustand während des Bootens ist. Andere Lösungen als Warten fallen mir keine ein, außer du lötest dir einen Server den du an die Netzwerkkarte dranhängst. :mrgreen:

Bernhard

paritycheck 1. Jul 2008 11:45

Re: Wake on LAN Problem :-(
 
Hi,

Wenn es nur darum geht zu überprüfen ob ein Rechner im Netzwerk eingeschaltet ist oder nicht nehme ich meistens diese Funktion. Indys gehen auch aber z.B bei Konsolenanwendungen wird mir dann die Exe zu groß :stupid:

Delphi-Quellcode:
unit hostalive;

interface

function IsHostAlive(Hostname: String; pTripTime: PCardinal = nil; Timeout: Integer = 1000; TTL: Integer = 255): Boolean;

implementation

uses
  Windows,
  Winsock;

type
  IP_OPTION_INFORMATION = packed record
    TTL: byte;
    TOS: byte;
    Flags: byte;
    OptionsSize: byte;
    OptionsData: pchar;
  end;
  PIP_OPTION_INFORMATION = ^IP_OPTION_INFORMATION;

  ICMP_ECHO_REPLY = packed record
    Address: in_addr;
    Status: Cardinal;
    RoundTripTime: Cardinal;
    DataSize: word;
    Reserved: word;
    Data: pointer;
    Options: IP_OPTION_INFORMATION;
  end;
  PICMP_ECHO_REPLY = ^ICMP_ECHO_REPLY;

function IcmpCreateFile(): Cardinal; stdcall; external 'Iphlpapi.dll' name 'IcmpCreateFile';
function IcmpCloseHandle(IcmpHandle: Cardinal): Boolean; stdcall; external 'Iphlpapi.dll' name 'IcmpCloseHandle';
function IcmpSendEcho(IcmpHandle: Cardinal; DestinationAddress: Cardinal; RequestData: Pointer; RequestSize: Word; RequestOptions: PIP_OPTION_INFORMATION; ReplyBuffer: Pointer; ReplySize: Cardinal; Timeout: Cardinal): Cardinal; stdcall; external 'Iphlpapi.dll' name 'IcmpSendEcho';

function IsHostAlive(Hostname: String; pTripTime: PCardinal = nil; Timeout: Integer = 1000; TTL: Integer = 255): Boolean;
const
  SendBuffer: array[0..31] of char =
              ('p', 'i', 'n', 'g', 'p', 'o', 'n', 'g',
               'p', 'i', 'n', 'g', 'p', 'o', 'n', 'g',
               'p', 'i', 'n', 'g', 'p', 'o', 'n', 'g',
               'p', 'i', 'n', 'g', 'p', 'o', 'n', 'g');
var
  WSA: TWSADATA;
  Reply: PICMP_ECHO_REPLY;
  Addr: Integer;
  hIcmp: cardinal;
  Options: IP_OPTION_INFORMATION;

  function ResolveHost(Hostname: String): Integer;
  type
    PPInAddr= ^PInAddr;
  var
    HostInfo: PHostEnt;
    T: PPInAddr;
  begin
    t:= nil;
    Result:= inet_addr(PChar(Hostname));
    if result = INADDR_NONE then begin
       HostInfo:= gethostbyname(PChar(Hostname));
       if HostInfo <> nil then
          T:= Pointer(HostInfo^.h_addr_list);
       if (T <> nil) and (T^<> nil) then begin
          Result:= T^^.S_addr;
       end;
    end;
  end;

begin
  Result:= False;
  FillChar(Options, sizeof(IP_OPTION_INFORMATION), #0);
  Reply:= nil;
  options.TTL:= TTL;
  options.TOS:= 1;
  if WSAStartUp(((0 shl 8)+2), WSA) = 0 then begin
     Addr:= ResolveHost(Hostname);
     if Addr <> INADDR_NONE then begin
        hIcmp:= IcmpCreateFile();
        if hicmp <> INVALID_HANDLE_VALUE then try
           Reply:= AllocMem(sizeof(ICMP_ECHO_REPLY)+sizeof(SendBuffer));
           IcmpSendEcho(hIcmp, Addr, @SendBuffer[0], sizeof(SendBuffer), @Options, Reply, sizeof(ICMP_ECHO_REPLY)+sizeof(SendBuffer), timeout);
           Result:= (Reply^.Status = 0);
           if Result and (pTripTime <> nil) then
              pTripTime^:= Reply^.RoundTripTime;
        finally
           IcmpCloseHandle(hIcmp);
           if Reply <> nil then
              FreeMem(Reply);
           WSACleanup();
        end;
     end else begin
        WSACleanup();
       // Hostname konnte nicht aufgelöst werden.
     end;
  end else begin
       // Winsock konnte nicht gestartet werden.
  end;
end;

end.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  RTT:Cardinal;
begin
  if IsHostalive('google.de', @RTT) then
     showmessage(inttostr(RTT)+'ms');
end;

TimmA 1. Jul 2008 15:52

Re: Wake on LAN Problem :-(
 
wenn ich das programm 1zu1 kopiere kann ich nicht kompilieren, liegt das an unseren verschiedenen delphi versionen?

toms 1. Jul 2008 15:54

Re: Wake on LAN Problem :-(
 
Zitat:

Zitat von TimmA
wenn ich das programm 1zu1 kopiere kann ich nicht kompilieren, liegt das an unseren verschiedenen delphi versionen?

:glaskugel: gut möglich, wo erhältst du denn einen Fehler?

TimmA 1. Jul 2008 16:37

Re: Wake on LAN Problem :-(
 
also, wenn ich den code so kopiere und einen button auf meine form ziehen will kommt:

"Fehler im Modul Unit11: Deklaration der Klasse TForm1 fehlt oder ist fehlerhaft"

bekomme ich irgendwie nicht hin das einzufügen :-(

wenn ich ein neues Projekt einfüge steht da ja auch

type
TForm1 = class(TForm)

wenn ich die tform1 zu den anderen bei type schreibe funktioniert es nicht :-(

rollstuhlfahrer 1. Jul 2008 16:38

Re: Wake on LAN Problem :-(
 
Mach aus TForm1 mal TForm11

TimmA 1. Jul 2008 16:45

Re: Wake on LAN Problem :-(
 
Zitat:

[Fehler] Unit1.pas(14): Undefinierter Bezeichner: 'TForm'
[Fehler] Unit1.pas(17): '=' erwartet, aber Bezeichner 'public' gefunden
[Fehler] Unit1.pas(19): ';' erwartet, aber 'END' gefunden
[Warnung] Unit1.pas(30): Text hinter dem abschließenden 'END.' wird vom Compiler ignoriert
[Fehler] Unit1.pas(5): Ungenügende Forward- oder External-Deklaration: 'IsHostAlive'
[Fataler Fehler] Project2.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
das mit der 11 hab ich ausprobiert, was habe ich falsch gemacht? :-((

Delphi-Quellcode:

unit hostalive;

interface

function IsHostAlive(Hostname: String; pTripTime: PCardinal = nil; Timeout: Integer = 1000; TTL: Integer = 255): Boolean;

implementation

uses
  Windows,
  Winsock;

type
    TForm11 = class(TForm)
    IP_OPTION_INFORMATION = packed record
    TTL: byte;
    TOS: byte;
    Flags: byte;
    OptionsSize: byte;
    OptionsData: pchar;
  end;
  PIP_OPTION_INFORMATION = ^IP_OPTION_INFORMATION;

  ICMP_ECHO_REPLY = packed record
    Address: in_addr;
    Status: Cardinal;
    RoundTripTime: Cardinal;
    DataSize: word;
    Reserved: word;
    Data: pointer;
    Options: IP_OPTION_INFORMATION;
  end;
  PICMP_ECHO_REPLY = ^ICMP_ECHO_REPLY;

function IcmpCreateFile(): Cardinal; stdcall; external 'Iphlpapi.dll' name 'IcmpCreateFile';
function IcmpCloseHandle(IcmpHandle: Cardinal): Boolean; stdcall; external 'Iphlpapi.dll' name 'IcmpCloseHandle';
function IcmpSendEcho(IcmpHandle: Cardinal; DestinationAddress: Cardinal; RequestData: Pointer; RequestSize: Word; RequestOptions: PIP_OPTION_INFORMATION; ReplyBuffer: Pointer; ReplySize: Cardinal; Timeout: Cardinal): Cardinal; stdcall; external 'Iphlpapi.dll' name 'IcmpSendEcho';

function IsHostAlive(Hostname: String; pTripTime: PCardinal = nil; Timeout: Integer = 1000; TTL: Integer = 255): Boolean;
const
  SendBuffer: array[0..31] of char =
              ('p', 'i', 'n', 'g', 'p', 'o', 'n', 'g',
               'p', 'i', 'n', 'g', 'p', 'o', 'n', 'g',
               'p', 'i', 'n', 'g', 'p', 'o', 'n', 'g',
               'p', 'i', 'n', 'g', 'p', 'o', 'n', 'g');
var
  WSA: TWSADATA;
  Reply: PICMP_ECHO_REPLY;
  Addr: Integer;
  hIcmp: cardinal;
  Options: IP_OPTION_INFORMATION;

  function ResolveHost(Hostname: String): Integer;
  type
    PPInAddr= ^PInAddr;
  var
    HostInfo: PHostEnt;
    T: PPInAddr;
  begin
    t:= nil;
    Result:= inet_addr(PChar(Hostname));
    if result = INADDR_NONE then begin
       HostInfo:= gethostbyname(PChar(Hostname));
       if HostInfo <> nil then
          T:= Pointer(HostInfo^.h_addr_list);
       if (T <> nil) and (T^<> nil) then begin
          Result:= T^^.S_addr;
       end;
    end;
  end;

begin
  Result:= False;
  FillChar(Options, sizeof(IP_OPTION_INFORMATION), #0);
  Reply:= nil;
  options.TTL:= TTL;
  options.TOS:= 1;
  if WSAStartUp(((0 shl 8)+2), WSA) = 0 then begin
     Addr:= ResolveHost(Hostname);
     if Addr <> INADDR_NONE then begin
        hIcmp:= IcmpCreateFile();
        if hicmp <> INVALID_HANDLE_VALUE then try
           Reply:= AllocMem(sizeof(ICMP_ECHO_REPLY)+sizeof(SendBuffer));
           IcmpSendEcho(hIcmp, Addr, @SendBuffer[0], sizeof(SendBuffer), @Options, Reply, sizeof(ICMP_ECHO_REPLY)+sizeof(SendBuffer), timeout);
           Result:= (Reply^.Status = 0);
           if Result and (pTripTime <> nil) then
              pTripTime^:= Reply^.RoundTripTime;
        finally
           IcmpCloseHandle(hIcmp);
           if Reply <> nil then
              FreeMem(Reply, sizeof(ICMP_ECHO_REPLY)+8);
           WSACleanup();
        end;
     end else begin
        WSACleanup();
       // Hostname konnte nicht aufgelöst werden.
     end;
  end else begin
       // Winsock konnte nicht gestartet werden.
  end;
end;

end.

rollstuhlfahrer 1. Jul 2008 16:50

Re: Wake on LAN Problem :-(
 
omg

code:

CODE

unit hostalive;

interface

function IsHostAlive(Hostname: String; pTripTime: PCardinal = nil; Timeout: Integer = 1000; TTL: Integer = 255): Boolean;

implementation

uses
Windows,
Winsock;

type
TForm11 = class(TForm) // *wegstreich*
IP_OPTION_INFORMATION = packed record
TTL: byte;
TOS: byte;
Flags: byte;
OptionsSize: byte;
OptionsData: pchar;
end;

(SNIP)


Den ganzen "Mist" speicherst du als eigenständige Unit (.pas-Datei). Dann fügst du die Datei an dein Projekt an (über das Oderner-mit-Plus-Symbol). Nun fügst du in der entsprechenden Unit (da wo du das verwenden willst) den bezeichner "hostalive" (o.ä. hauptsache den Namen der Unit) in die Uses-Liste.
Dann mal weitersehen.

Bernhard

EDIT: Falls du grad ein wenig Zeit hast, bleib online. Ich versuch so schnell wie es geht zu antworten


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz