function OrdiIP(Ordi: string): string;
var
WSAData : TWSAData;
Name,Address : String;
Phe : PHostEnt;
begin
//Demarrage du gestinnaire de socket
WSAStartup(2,WSAData);
SetLength(Name,255);
Phe := GetHostByName(PChar(Ordi));
with Phe^ do
//Formatage du resultat en string
Address := Format ('%d.%d.%d.%d' , [Byte(h_addr^[0]),Byte(h_addr^[1]),
Byte(h_addr^[2]),Byte(h_addr^[3])]);
//Fermeture du gestinnaire de socket
WSACleanup;
OrdiIP := Address;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hEnum : DWORD;
dwResult : DWORD;
cEntries : DWORD;
cbBuffer : DWORD;
Machine1,Machine2,Resu : string;
I,maclen : Integer;
lpnr : PNetResource;
ip : DWORD;
mac : TAdresseMac;
begin
cEntries := $FFFFFFFF;
cbBuffer := 16384;
if ( WNetOpenEnum( RESOURCE_CONTEXT, RESOURCETYPE_ANY, 0, lpnr, hEnum ) <> NO_ERROR ) then Exit;
dwResult := WNetEnumResource( hEnum, cEntries, lpnr, cbBuffer );
if (dwResult <> NO_ERROR) then Exit;
Inc( lpnr );
for I := 0 to ( cEntries - 1 ) do
begin
Machine1 := copy(lpnr^.lpRemoteName,3,Length(lpnr^.lpRemoteName));
Machine2 := OrdiIP(Machine1);
ip := inet_addr( PChar(Machine2) );
maclen := SizeOf(TAdresseMac);
SendArp ( ip, 0, @mac, @maclen );
Resu := Format( '%.2x-%.2x-%.2x-%.2x-%.2x-%.2x', [ mac[1], mac[2], mac[3], mac[4], mac[5], mac[6] ] );
Memo1.Lines.Add(Machine1+' '+Machine2+' '+Resu);
Inc( lpnr );
end;
WNetCloseEnum( hEnum );
end;
end.
///////////////////////////
la remarque, c'est que c'est trés trés long à l'execution. est ce que je peux optimiser ce code??
et puis je sens que ça ne balaye pas vraiment tout mon réseau local...
aidez moi!
merci infiniment!!
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 10 déc. 2006 à 23:10
comme je n'ai pas la ElgAPI je peu pas tout verifier, mais de memo ça donne :
la on devrait gagner quelque ms
remplacer le TMemo par une TListBox
type
TIPAddress = array[0..3] of byte;
TMACAddress = array[0..5] of byte;
function IPToStr(const IP : TIPAddress) : string;
var L,N : integer;
pR : ^Byte;
begin
L := 3;
for N := 0 to 3 do
case IP[N] of
0..9 : inc(L);
10..99 : inc(L,2);
100..255 : inc(L,3);
end;
SetLength(Result, L);
pR := @PChar(result)^;
for N := 0 to 3 do begin
case IP[N] of
0..9 : begin
pR^ := IP[N]+$30;
inc(pR);
end;
10..99 : begin
pR^ := (IP[N] div 10)+$30;
inc(pR);
pR^ := (IP[N] mod 10)+$30;
inc(pR);
end;
100..255 : begin
pR^ := (IP[N] div 100)+$30;
inc(pR);
pR^ := ((IP[N] div 10) mod 10)+$30;
inc(pR);
pR^ := (IP[N] mod 10)+$30;
inc(pR);
end;
end;
if N < 3 then begin
pR^ := $2E;
inc(pR);
end;
end;
end;
function MACToStr(const MAC : TMACAddress) : string;
var pR : PChar;
N : integer;
pB : ^byte;
const
Digits : array[0..$F] of char = '0123456789ABCDEF';
begin
SetLength(result, 17);
pB := @MAC;
pR := PChar(result);
for N := 0 to 5 do begin
pR[0] := Digits[ pB^ shr 4 ];
pR[1] := Digits[ pB^ and $F];
if N < 5 then begin
pR[2] := '-';
inc(pR,3);
end else
inc(pR,2);
inc(pB);
end;
end;
function GetHostIp(const HostName : string): TIPAddress;
var
WSAData : TWSAData;
Phe : pHostEnt;
begin
WSAStartup(2, WSAData);
Phe := GetHostByName(PChar(HostName));
Move(Phe^.h_addr^[0], Result, 4);
WSACleanup;
end;
procedure TForm1.Button1Click(Sender : Tobject);
var
hEnum,
dwResult,
cEntries,
cbBuffer,
ip : DWORD;
Machine1,
Machine2,
Resu : string;
I,
maclen : Integer;
lpnr : PNetResource;
mac : TAdresseMac;
AMac : TMacAdress;
begin
cEntries := $FFFFFFFF;
cbBuffer := 16384;
lpnr := PNETRESOURCE( GlobalAlloc(GPTR, cbBuffer) );
if WNetOpenEnum( RESOURCE_CONTEXT, RESOURCETYPE_ANY, 0, lpnr, hEnum ) <> NO_ERROR then Exit;
cs_othland
Messages postés298Date d'inscriptionjeudi 18 décembre 2003StatutMembreDernière intervention 9 février 20101 11 déc. 2006 à 09:52
slt tlm;
merci infiniment pour votre aide!
au fait, il me reste 2 petits problèmes:
1er :
transtypage incorrect pour l'instruction : Move(PChar(mac)^[0],AMac,6)
2eme:
identificateur non déclaré : 'WNetClosEnum'
et pourtant j'ai mis dans la close uses : Winsock
j'arrive pas à comprendre pourquoi ça ne marche pas!
merci encore une fois!
.nb: les formules mathématiques sont excellentes!!
cs_othland
Messages postés298Date d'inscriptionjeudi 18 décembre 2003StatutMembreDernière intervention 9 février 20101 11 déc. 2006 à 10:44
salut:
le 2eme problème est reglé, il manquait un petit 'e' dans 'WNetCloseEnum'.
un autre problème :
j'ai remarqué que mon adresse physique affichée en utilisant cette application ne correspond pas à celle obtenue en utilisant la commande :
ipconfig /all
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 11 déc. 2006 à 16:21
pour Move(PChar(mac)^[0],AMac,6) j'avais deduis que MAC etait de type string. si il est de type PChar, il faut faire :
Move(Mac^[0], AMac, 6);
si il est de type tableau de byte :
Move(Mac, AMac, 6);
@Elguevel : tu es sur que j'ai participer au developement de la ElgAPI ???!
j'en doute beaucoup, je ne me rappel pas avoir fait cela ... tu es sur que tu ne confond pas avec Cirec ou Francky ou encore Florenth ou Japee ou meme DelphiProg ?
Pour IPToSTR on pourrait croire que la solution est alambiquée mais elle est deux fois plus rapide que Format('%d.%d.%d.%d'...);
idem pour MacToStr ... largement plus rapide que format('%.2x-%.2x-%.2x-%.2x-%.2x-%.2x',...);
sinon je veux bien avoir le liens vers la ElgAPI car j'en ai trouver une sur une de tes sources, mais elle n'as pas l'air de correspondre a celle ci ...
function OrdiIP(Ordi: string): string;
var
WSAData : TWSAData;
Name,Address : String;
Phe : PHostEnt;
begin
//Demarrage du gestinnaire de socket
WSAStartup(2,WSAData);
SetLength(Name,255);
Phe := GetHostByName(PChar(Ordi));
if Phe=nil then exit;
with Phe^ do
//Formatage du resultat en string
Address := Format ('%d.%d.%d.%d' , [Byte(h_addr^[0]),Byte(h_addr^[1]),
Byte(h_addr^[2]),Byte(h_addr^[3])]);
//Fermeture du gestinnaire de socket
WSACleanup;
OrdiIP := Address;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hEnum : DWORD;
dwResult : DWORD;
cEntries : DWORD;
cbBuffer : DWORD;
Machine1,Machine2,Resu : string;
I,maclen : Integer;
lpnr : PNetResource;
ip : DWORD;
mac : TAdresseMac;
begin
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
end.
////////////////////////
le problème c'est que dans mon réseau, j'ai des PC et des termineaux biométriques (chacun a une apresse IP) et je peux pas l'avoir en utilisant ce code!!!!
je pense que c'est due à l'impossibilité d'établir une socket avec ces termiveaux, donc est ce que je peux avoir leur adresse IP sans les socket!!!
vraiment...il me faut leur adresse IP