![]() |
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 |
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? |
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 |
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; |
Re: Wake on LAN Problem :-(
wenn ich das programm 1zu1 kopiere kann ich nicht kompilieren, liegt das an unseren verschiedenen delphi versionen?
|
Re: Wake on LAN Problem :-(
Zitat:
|
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 :-( |
Re: Wake on LAN Problem :-(
Mach aus TForm1 mal TForm11
|
Re: Wake on LAN Problem :-(
Zitat:
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. |
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. |
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