![]() |
Indy und Ping
Kann die ICMP Komponente von Indy mehr als nur pingen? Ich würde gerne hier im LAN eine IP in einen Rechnernamen auflösen. Geht das irgendwie?
|
Re: Indy und Ping
Das Geht normal auch mit WinApi mitteln ohne Indy
hatte mal sowas zum holen der eigenen IP verwendet
Delphi-Quellcode:
Deine Stichworte wären da GetHostname und GetHostbyName...
function HoleIpAddresse: string;
var phoste: PHostEnt; Buffer: array [0..100] of char; WSAData: TWSADATA; begin result := ''; if WSAStartup($0101, WSAData) <> 0 then exit; GetHostName(Buffer,Sizeof(Buffer)); phoste:=GetHostByName(buffer); if phoste = nil then result := '127.0.0.1' else result := StrPas(inet_ntoa(PInAddr(phoste^.h_addr_list^)^)); WSACleanup; end; Gruß Matthias |
Re: Indy und Ping
GetHostname kennt er nicht, auch die Hilfe nicht. Es ist Delphi 7. Hmmmmmm...
|
Re: Indy und Ping
hmm, ich habs in Delphi 4 verwendet, ist eine WinAPI.
hast du auch das winsöckchen(winsock) eingebunden, ohne läufts nicht. Gruß Matthias [EDIT] Mehr Infos darüber findest du in der "Platform SDK: Windows Sockets 2" im msdn mußt halt googeln, link hab ich nicht gespeichert [EDIT] |
Re: Indy und Ping
Ne, das könnte ich mal probieren... nach der Mittagspause. Mahlzeit!
|
Re: Indy und Ping
Jetzt kennt er es, aber ich brauche ja etwas für eine andere IP :)
|
Re: Indy und Ping
Nur so nebenbei...
für was brauchst du das, du kannst dochmit sowohl IP als auch rechnerName einen anderen PC ansprechen. Aber schön, deine WinAPI dazu heißt WNetEnumResource. so als *zuggerl* wie man in Bayern sagt :-D
Delphi-Quellcode:
Aufruf im Programm dann z.B.
type
PNetResourceArray = ^TNetResourceArray; TNetResourceArray = array[0..100] of TNetResource; function CreateNetResourceList(ResourceType: DWord; NetResource: PNetResource; out Entries: DWord; out List: PNetResourceArray): Boolean; var EnumHandle: THandle; BufSize: DWord; Res: DWord; begin Result := False; List := Nil; Entries := 0; if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType, 0, NetResource, EnumHandle) = NO_ERROR then begin try BufSize := $4000; // 16 kByte GetMem(List, BufSize); try repeat Entries := DWord(-1); FillChar(List^, BufSize, 0); Res := WNetEnumResource(EnumHandle, Entries, List, BufSize); if Res = ERROR_MORE_DATA then begin ReAllocMem(List, BufSize); end; until Res <> ERROR_MORE_DATA; Result := Res = NO_ERROR; if not Result then begin FreeMem(List); List := Nil; Entries := 0; end; except FreeMem(List); raise; end; finally WNetCloseEnum(EnumHandle); end; end; end; procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings); procedure ScanLevel(NetResource: PNetResource); var Entries: DWord; NetResourceList: PNetResourceArray; i: Integer; begin if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try for i := 0 to Integer(Entries) - 1 do begin if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or (NetResourceList[i].dwDisplayType = DisplayType) then begin List.AddObject(NetResourceList[i].lpRemoteName, Pointer(NetResourceList[i].dwDisplayType)); end; if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then ScanLevel(@NetResourceList[i]); end; finally FreeMem(NetResourceList); end; end; begin ScanLevel(Nil); end;
Delphi-Quellcode:
schon hast du alle rechnernamen im Netzwerk.
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, irgendeinelistbox.Items);
viel Spass damit :balloon: |
Re: Indy und Ping
Das werd ich mir mal zu Gemüte führen, danke! Meine Software soll mir bei der Administration in der Firma helfen und dieser Programmteil scannt das Netzwerk durch, welche PCs online und offline sind. Und da ich auswendig nicht weiß, welche IP zu welchem Rechnernamen gehört, soll der Rechnername automatisch geholt werden. So zumindest die Theorie ;)
|
Re: Indy und Ping
So, habe endlich mal Zeit gehabt und es erfolgreich getestet. Nur eine Änderung müsste ich haben, die in da nicht rauslesen kann: Wie finde ich den Rechnernamen für genau EINE IP Adresse heraus?
|
Re: Indy und Ping
Dann wäre das nicht GetHostByName, sondern GetHostByAddr:
Delphi-Quellcode:
function IPAddrToName(AIPAddr: string): string;
var SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData; begin WSAStartup($101, WSAData); try SockAddrIn.sin_addr.s_addr := inet_addr(PChar(AIPAddr)); HostEnt := GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if Assigned(HostEnt) then Result := StrPas(Hostent^.h_name) else Result := ''; finally WSACleanup; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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