OK.. wiec na poczatek mam sobie funkcje inet_addr, ktroa wymaga jako argumentu adresu IP w formie "kropkowanej" (np. 192.160.0.127) .. a zwraca adres w formie "internetowej" czyli liczby typu Cardinal.. przynajmniej tak jest napisane w helpie :) ale wszystko jest spoko dopoki ostatni oktet adresu IP jest mniejszy niz 128.. po przekroczeniu tej wartosci funkcje zwraca ujemne adresy!! Na pewno przyjdze wam do glowy napisac ze trzeba zmienic typ zmiennej przechowujacej ten adres bo wykracza on poza obszar odwzorowania.. czy jakos tak.. :) ale nic z tego.. zmienialem juz na wszystko od byte :P poprzez u_long, dword, po int64 .. i wszystko zwraca ta sama wartosc, ujemna!! Probowalem nawet uzyc typu stworzanego specjalnie na potrzeby tej funkcji przez programistow (z Microsoftu chyba) .. :) ale to nic nie zmienia.. efekt zawsze ten sam.. Range check Error.. :( ponizej napisze kilka linijek tego kodu (te najwazniejsze) zeby moze ktos mi pomogl.. :)
function GetMAC(IP:string):string;
var dwResult : DWord;
ulIPAddr : DWord;
//ulIPAddr : TSockAddrIn;
ulMACAddr : array [0..5] of Byte;
ulAddrLen : ULONG;
const INADDR_NONE = $FFFFFFFF;
begin
ulIPAddr := inet_addr(PChar('192.168.0.128'));
// ulIPAddr.sin_addr.S_addr:= inet_addr('192.168.0.128');
ShowMessage(IntToHex(ulIPAddr,8)+': ciagle dziala :'+inttostr(ulIPAddr));
// ShowMessage(IntToHex(ulIPAddr.sin_addr.s_addr,8)+': dziala :'+inttostr(ulIPAddr.sin_addr.s_addr));
if ulIPAddr = INADDR_NONE then exit;
// if ulIPAddr.sin_addr.s_addr = INADDR_NONE then exit;
ulAddrLen := 6;
dwResult := SendARP(ulIPAddr,0,@ulMACAddr,@ulAddrLen);
// dwResult := SendARP(ulIPAddr.sin_addr.S_addr,0,@ulMACAddr,@ulAddrLen);
ShowMessage('dwResult: '+IntToStr(dwResult)); // if 0, then ok
result:=(IntToHex(ulMACAddr[0],2)+':'+IntToHex(ulMACAddr[1],2)+':'+
IntToHex(ulMACAddr[2],2)+':'+IntToHex(ulMACAddr[3],2)+':'+
IntToHex(ulMACAddr[4],2)+':'+IntToHex(ulMACAddr[5],2));
end;
Te wykomentowane czesci to wlasnie uzycie tego specjalnego tylu.. :( pomocy!!