Alle IP-adresserne fra LAN

Tags:    delphi

Er der ikke måde til at få alle IP-adresserne i det lokale netværk?

Emil Melgaard
emil.melgaard@private.dk
- Admin på gruppen Delphi spilprogrammering.
http://www.delphispilprogram.udvikleren.dk



8 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hej Emil

Her en funktion fra min egen "netværksscanner" komponent.
Den burde hjælpe dig lidt hen af vejen (selvom jeg har kommenteret den på engelsk).

function TSFHWorkgroupEnum.GetHostIP(Host : string; var ipstr : string) : DWORD;

{ Function result is a DWORD which indicates which WSA error
occurred. Zero means no errors. The resolved ip is returned
in "var ipstr". }

var
hEntity : pHostEnt;
WSAData : TWSAData;
IpAddr : string;
i : integer;

begin
{ WinSock init }
if WSAStartup($0101, WSAData) <> 0 then begin
Result := WSAGetLastError;
Exit;
end;

{ Strip any leading \\ char from host }
while (Host[1] = '\\') do delete(host, 1, 1);

{ Get host info }
hEntity := GetHostByName(PCHAR(Host));

{ Convert Ip to a string }
if (hEntity <> nil) then begin
{ Build the ip string }
for i := 0 to hEntity^.h_length - 1 do
IPaddr := Concat(IPaddr, IntToStr(Ord(hEntity^.h_addr_list^)) + '.');
{ Shorten string length }
SetLength(IPaddr, Length(IPaddr) - 1);
{ Return result }
IpStr := IPaddr;
Result := 0;
end else
Result := WSAGetLastError;

{ Stop WinSock }
WSACleanup;
end;




Hej Emil

Her en funktion fra min egen "netværksscanner" komponent.
Den burde hjælpe dig lidt hen af vejen (selvom jeg har kommenteret den på engelsk).

function TSFHWorkgroupEnum.GetHostIP(Host : string; var ipstr : string) : DWORD;

{ Function result is a DWORD which indicates which WSA error
occurred. Zero means no errors. The resolved ip is returned
in "var ipstr". }

var
hEntity : pHostEnt;
WSAData : TWSAData;
IpAddr : string;
i : integer;

begin
{ WinSock init }
if WSAStartup($0101, WSAData) <> 0 then begin
Result := WSAGetLastError;
Exit;
end;

{ Strip any leading \\ char from host }
while (Host[1] = '\\') do delete(host, 1, 1);

{ Get host info }
hEntity := GetHostByName(PCHAR(Host));

{ Convert Ip to a string }
if (hEntity <> nil) then begin
{ Build the ip string }
for i := 0 to hEntity^.h_length - 1 do
IPaddr := Concat(IPaddr, IntToStr(Ord(hEntity^.h_addr_list^)) + '.');
{ Shorten string length }
SetLength(IPaddr, Length(IPaddr) - 1);
{ Return result }
IpStr := IPaddr;
Result := 0;
end else
Result := WSAGetLastError;

{ Stop WinSock }
WSACleanup;
end;


Den kommer med fejl når jeg kompilerer den:

[Error] Unit1.pas(36): Undeclared identifier: 'pHostEnt'
[Error] Unit1.pas(37): Undeclared identifier: 'TWSAData'
[Error] Unit1.pas(43): Undeclared identifier: 'WSAStartup'
[Warning] Unit1.pas(43): Comparing signed and unsigned types - widened both operands
[Error] Unit1.pas(44): Undeclared identifier: 'WSAGetLastError'
[Error] Unit1.pas(52): Undeclared identifier: 'GetHostByName'
[Error] Unit1.pas(55): Operator not applicable to this operand type
[Error] Unit1.pas(57): Pointer type required
[Error] Unit1.pas(68): Undeclared identifier: 'WSACleanup'
[Error] Unit1.pas(73): Types of actual and formal var parameters must be identical
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Her kan du se hvor fejlene kommer:

<pre>{01} unit Unit1;
{02}
{03} interface
{04}
{05} uses
{06} Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
{07} Dialogs, StdCtrls;
{08}
{09} type
{10} TForm1 = class(TForm)
{11} Edit1: TEdit;
{12} Button1: TButton;
{13} Edit2: TEdit;
{14} procedure Button1Click(Sender: TObject);
{15} private
{16} { Private declarations }
{17} function GetHostIP(Host : string; var ipstr : string) : DWORD;
{18} public
{19} { Public declarations }
{20} end;
{21}
{22} var
{23} Form1: TForm1;
{24}
{25} implementation
{26}
{27} {$R *.dfm}
{28}
{29} function TForm1.GetHostIP(Host : string; var ipstr : string) : DWORD;
{30}
{31} { Function result is a DWORD which indicates which WSA error
{32} occurred. Zero means no errors. The resolved ip is returned
{33} in "var ipstr". }
{34}
{35} var
{36} hEntity : pHostEnt;
{37} WSAData : TWSAData;
{38} IpAddr : string;
{39} i : integer;
{40}
{41} begin
{42} { WinSock init }
{43} if WSAStartup($0101, WSAData) <> 0 then begin
{44} Result := WSAGetLastError;
{45} Exit;
{46} end;
{47}
{48} { Strip any leading \\ char from host }
{49} while (Host[1] = '\\') do delete(host, 1, 1);
{50}
{51} { Get host info }
{52} hEntity := GetHostByName(PCHAR(Host));
{53}
{54} { Convert Ip to a string }
{55} if (hEntity <> nil) then begin
{56} { Build the ip string }
{57} for i := 0 to hEntity^.h_length - 1 do
{58} IPaddr := Concat(IPaddr, IntToStr(Ord(hEntity^.h_addr_list^)) + '.');
{59} { Shorten string length }
{60} SetLength(IPaddr, Length(IPaddr) - 1);
{61} { Return result }
{62} IpStr := IPaddr;
{63} Result := 0;
{64} end else
{65} Result := WSAGetLastError;
{66}
{67} { Stop WinSock }
{68} WSACleanup;
{69} end;
{70}
{71} procedure TForm1.Button1Click(Sender: TObject);
{72} begin
{73} GetHostIP(Edit1.Text, Edit2.Text);
{74} end;
{75}
{76} end.</pre>Emil Melgaard
emil.melgaard@private.dk
- Admin på gruppen Delphi spilprogrammering.
http://www.delphispilprogram.udvikleren.dk




Yo Emil

Jeg glemt lige at skrive at du skal inkludere WinSock i din uses statement.

Ca. sådan her.

Uses
forms, dialogs.... etc... , WinSock;

Så burde diverse kompiler fejl være af vejen ;-)






PS!

Hvis du evt. er interesseret i at teste min komplete netværkscanner komponent og lover ikke at videre give den til andre vil jeg da med glæde sende den til dig.
Jeg har kun testet den i et "arbejdsgruppe" miljø og vil vældigt gerne have testet den under andre
forhold.






Yo Emil

Jeg glemt lige at skrive at du skal inkludere WinSock i din uses statement.

Ca. sådan her.

Uses
forms, dialogs.... etc... , WinSock;

Så burde diverse kompiler fejl være af vejen ;-)




Nu kommer der nogle andre fejl:

[Error] Unit1.pas(58): Incompatible types
[Error] Unit1.pas(73): Types of actual and formal var parameters must be identical
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

(Det er den samme kode som før)

Emil Melgaard
emil.melgaard@private.dk
- Admin på gruppen Delphi spilprogrammering.
http://www.delphispilprogram.udvikleren.dk



Hmmm jeg har lige kigget på det. Her er en løsning.

[Error] Unit1.pas(73): Types of actual and formal var parameters must be identical


Funktionen er deklararet sådan her:
function GetHostIP(Host : string; var ipstr : string) : DWORD;

Du kalder den sådan her:
GetHostIP(edit1.text, edit2.txt);

Argumentet ipstr er deklararet som "var string", hvilket betyder at du skal parse en "string variabel" til funktionen og ikke en TCaption som Edit2.Text er.

Skriv som følger i stedet:

procedure TForm1.Button1Click(Sender: TObject);

var ipstr : string; // Denne her er vigtigt !!!

begin
if GetHostIp(Edit1.Text, ipstr) = 0 then
Edit2.Text := ipstr
else
Edit2.text := 'Failed';
end;


[Error] Unit1.pas(58): Incompatible types


Hmmmm denne her kan jeg ikke lige gennemskue.
Hvilken Delphi version kører du med, og hvilke compiler options er sat ?
Jeg gætter på at løsningen ligger der.
Jeg selv kører Delphi5 med default compiler options på denne kode og
det spiller fint.


[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'


Denne meddelse optræder altid når der er andre compiler fejl.






Delphi 7 Enterprise med default compiler options.

Emil Melgaard
emil.melgaard@private.dk
- Admin på gruppen Delphi spilprogrammering.
http://www.delphispilprogram.udvikleren.dk



Er du sikker på at den funktion kan give mig alle Ip/hostname fra det lokale netværk?

Nåh... Jeg har fundet noget andet der kan, men hvis du kan bevise at din virker kan du få 50 up.

Emil Melgaard
emil.melgaard@private.dk
- Admin på gruppen Delphi spilprogrammering.
http://www.delphispilprogram.udvikleren.dk



t