Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy und Ping (https://www.delphipraxis.net/90805-indy-und-ping.html)

JPSelter 24. Apr 2007 08:39


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?

matashen 24. Apr 2007 10:01

Re: Indy und Ping
 
Das Geht normal auch mit WinApi mitteln ohne Indy

hatte mal sowas zum holen der eigenen IP verwendet

Delphi-Quellcode:
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;
Deine Stichworte wären da GetHostname und GetHostbyName...

Gruß Matthias

JPSelter 24. Apr 2007 10:53

Re: Indy und Ping
 
GetHostname kennt er nicht, auch die Hilfe nicht. Es ist Delphi 7. Hmmmmmm...

matashen 24. Apr 2007 11:10

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]

JPSelter 24. Apr 2007 11:27

Re: Indy und Ping
 
Ne, das könnte ich mal probieren... nach der Mittagspause. Mahlzeit!

JPSelter 24. Apr 2007 13:14

Re: Indy und Ping
 
Jetzt kennt er es, aber ich brauche ja etwas für eine andere IP :)

matashen 24. Apr 2007 13:54

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:
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;
Aufruf im Programm dann z.B.

Delphi-Quellcode:
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, irgendeinelistbox.Items);
schon hast du alle rechnernamen im Netzwerk.

viel Spass damit
:balloon:

JPSelter 24. Apr 2007 15:10

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 ;)

JPSelter 2. Mai 2007 12:56

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?

CCRDude 2. Mai 2007 13:00

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 05:32 Uhr.
Seite 1 von 2  1 2      

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