Hallo!
Ich schreibe gerade einen Netzwerk Traffic Monitor. Um den Adapter zu identifizieren benutze ich die MAC-Adresse. Allerdings bekomme ich jedesmal wenn ich mir neue Daten von der IPHlpApi hole (ich benutze die Header vom
JEDI Project) eine andere MAC Addresse.
Hier mein Code:
Delphi-Quellcode:
procedure TTraffic.ProcessNetworkData(Sender: TObject);
var
Size: ULONG;
pIfTable: PMibIfTable;
begin
{ Get IfTableMIB... }
Size := 0;
// First call: Get memsize needed
if not GetIfTable(nil, Size, True) = ERROR_BUFFER_OVERFLOW then
Exit;
try
pIfTable := AllocMem(Size);
if GetIfTable(pIfTable, Size, True) = ERROR_SUCCESS then
UpdateAdaptersList(pIfTable);
finally
FreeMem(pIfTable);
end;
end;
procedure TTraffic.UpdateAdaptersList(var pIfTable: PMibIfTable);
var
I: Integer;
Adapter: TAdapter;
begin
{ Check which TAdapter-Objects are to delete... }
for I := 0 to FAdapters.Count -1 do
if not IsIndexValid(TAdapter(FAdapters[I]).AdapterIndex, pIfTable) then
begin
{ OnAdapterDelete event }
if Assigned(FOnAdapterDelete) then
FOnAdapterDelete(FAdapters[I] as TAdapter);
{ Delete adapter... }
FAdapters.Delete(I);
end;
{ Check which TAdapter-Objects are to add and update existing adapters... }
{ pIfTable^.table[x] = TMibIfRow }
for I := 0 to pIfTable^.dwNumEntries - 1 do
begin^
// HIER IST DAS PROBLEM: bPhysAddr HAT IMMER EINEN ANDEREN WERT!
Adapter := GetAdapterByMACAddr(TMACAddress(pIfTable^.table[I].bPhysAddr),
pIfTable^.table[I].dwPhysAddrLen);
if Adapter <> nil then
Adapter.FeedWithData(pIfTable^.table[I])
else
RegisterNewAdapter(pIfTable^.table[I]);
end
function TTraffic.GetAdapterByMACAddr(const MACAddr: TMACAddress;
const MACAddrLen: Cardinal): TAdapter;
var
I: Integer;
begin
{ Return adapter with given MAC-address }
Result := nil;
for I := 0 to FAdapters.Count -1 do
begin
if (TAdapter.MacAddrToStr(MACAddr, MACAddrLen)) = (TAdapter(FAdapters[I]).MACAddr) then
begin
Result := FAdapters[I] as TAdapter;
Exit;
end;
end;
end;
FAdapters ist eine TObjectList. Der Fehler liegt garantiert nicht bei der class function MacAddrToStr.
Das Problem ist: pIfTable^.table[I].bPhysAddr hat immer einen anderen Wert. Allerdings halte ich es für ein Gerücht, dass sich meine MAC-Adresse sekündlich ändert.
Hoffentlich kann mir jemand helfen...
Vielen Dank für eure Hilfe,
Andreas
Andreas N.