![]() |
Salat im UDPTable
Morgen's :)
Ich versuche den UDP Table zu holen. Die Anzahl der Verbindungen ist richtig (stimmt mit TCPView von Sysinternals überein) Aber der Rest ist Salat :gruebel:
Delphi-Quellcode:
program UDP;
{$APPTYPE CONSOLE} uses SysUtils, Windows, WinSock; type TTableOwnerPID = record PID: Cardinal; Protocol: string[3]; localIP: DWORD; localPort: DWORD; remoteIP: DWORD; remotePort: DWORD; Status: DWORD; end; type ATableOwnerPID = Array of TTableOwnerPID; type UDP_TABLE_CLASS = Integer; ULONG = Integer; const ANY_SIZE = 1; IpHlpApiLib = 'iphlpapi.dll'; UDP_TABLE_OWNER_PID_ALL = 2; type MIB_UDPROW_OWNER_PID = packed record dwState: DWORD; dwLocalAddr: DWORD; dwLocalPort: DWORD; dwRemoteAddr: DWORD; dwRemotePort: DWORD; dwOwningPid: DWORD; end; PMIB_UDPROW_OWNER_PID = ^MIB_UDPROW_OWNER_PID; type MIB_UDPTABLE_OWNER_PID = packed record dwNumEntries: DWord; table: array [0..ANY_SIZE - 1] of MIB_UDPROW_OWNER_PID ; end; PMIB_UDPTABLE_OWNER_PID = ^MIB_UDPTABLE_OWNER_PID; type TGetExtendedUdpTable = function (pUpdTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: UDP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall; var pGetExtendedUdpTable: TGetExtendedUdpTable; hLib: Cardinal; function LoadAPI: Boolean; begin Result := False; hLib := LoadLibrary(IpHlpApiLib); if hLib <> 0 then begin @pGetExtendedUdpTable := GetProcAddress(hLib, 'GetExtendedUdpTable'); end; Result := (Assigned(pGetExtendedUdpTable)); end; procedure UnLoadAPI; begin if Assigned(pGetExtendedUdpTable) then pGetExtendedUdpTable := nil; if hLib <> 0 then FreeLibrary(hLib); end; function GetUPDTable: ATableOwnerPID; var pUdpTable: PMIB_UDPTABLE_OWNER_PID; dwSize: DWord; Res: Dword; I: Integer; begin SetLength(Result, 0); pUdpTable:=Nil; Try dwSize:=0; Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0); If (Res = ERROR_INSUFFICIENT_BUFFER) Then Begin GetMem(pUdpTable,dwSize); Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0); end; if Res = NO_ERROR then begin SetLength(Result, pUdpTable.dwNumEntries); // die anzahl der ermittelten einträge stimmt for I := 0 to pUdpTable.dwNumEntries-1 do begin Result[I].Protocol := 'UDP'; Result[I].PID := pUdpTable.table[I].dwOwningPid; // aber ab hier steht salat Result[I].localIP := pUdpTable.table[I].dwLocalAddr; Result[I].localPort := pUdpTable.table[I].dwLocalPort; Result[I].remoteIP := 0; // pUdpTable.table[I].dwRemoteAddr; Result[I].remotePort := 0; // pUdpTable.table[I].dwRemotePort; Result[I].Status := 99; // pUdpTable.table[I].dwState; end; // end of for end; // end of Res = NO_ERROR finally If (pUdpTable <> Nil) Then FreeMem(pUdpTable); end; end; function GetAddress(AIpAdress, APort: DWord): String; var IP: in_addr; begin IP.S_addr := AIpAdress; Result := inet_ntoa(IP) + ':' + IntToStr(htons(APort)); end; var UDPArray: ATableOwnerPID; I: Integer; ResLn: String; begin if LoadApi then begin UDPArray := GetUPDTable; for I := Low(UDPArray) to High(UDPArray) do begin ResLn := IntToStr(UDPArray[I].PID); ResLn := ResLn + StringOfchar(' ',5) + UDPArray[I].Protocol; ResLn := ResLn + StringOfchar(' ',5) + GetAddress(UDPArray[I].localIP, UDPArray[I].localPort); ResLn := ResLn + StringOfchar(' ',5) + GetAddress(UDPArray[I].remoteIP, UDPArray[I].remotePort); writeln( ResLn ); end; UnloadApi; end else begin writeln('Kein API Support.'); end; end. |
Re: Salat im UDPTable
Delphi-Quellcode:
Könnte es damit zusammenhängen, das pUpdTable ein Pointer auf MIB_...
PMIB_UDPROW_OWNER_PID = ^MIB_UDPROW_OWNER_PID;
pUdpTable: PMIB_UDPTABLE_OWNER_PID; ist und pUpdTable nie instantiiert wurde. (pUdpTable:=Nil;) Grüße Klaus |
Re: Salat im UDPTable
Hallo Klaus,
meiner Auffassung wird pUdpTable durch die Funktion GetExtendedUdpTable inizalisiert. Die Anzahl der Einträge ist ja auch korrekt. |
Re: Salat im UDPTable
Da kannst Du recht haben.
Sag einmal, welche DLL brauch ich noch neben der iphlpapi.dll um das Programm ausführen zu können. Ich bekomme immer eine Fehlermeldung das irgendwas mit ipv6 in der ntdll.dll nicht gefunden wird. Grüße Klaus |
Re: Salat im UDPTable
Liste der Anhänge anzeigen (Anzahl: 1)
Du brauchst auf jeden Fall Windows XP... :wink:
@Harry: Ich habe vor längerer Zeit auch mal mit den Extended - Geschichten herumgespielt... Irgendwo müsste der Code noch herumflattern..... //edit: So, da isses. Hoffentlich hilft's... :wink: |
Re: Salat im UDPTable
@Daniel G:
Das sieht schonmal sehr sehr gut aus.:thumb: Ich check das mal durch und meld mich dann wieder! @Klaus01; Der Code rennt erst erst ab XP Sp 2 oder höher (2003/Vista). Welches Os/Sp hast Du denn drauf und wie bitte, ist genau nochmal die Fehlermeldung. |
Re: Salat im UDPTable
Liste der Anhänge anzeigen (Anzahl: 1)
Hier w2k und zuhause XP mit allen Patchen.
Werde es heute abend einmal zuhause testen. Fehlermeldung habe ich angehängt. Grüße Klaus |
Re: Salat im UDPTable
@Klaus: Danke. Kann ich dann künftig berücksitigen.
@Daniel G: Die Unit ist Klasse! Das bekomm ich jetzte zum laufen! Danke vielmals. PS: Dein Net-Mon hab ich auch gleich "gesavt" :mrgreen: |
Re: Salat im UDPTable
Zitat:
|
Re: Salat im UDPTable
Guten Abend,
Code:
Quelle: ->
typedef struct {
DWORD dwLocalAddr; DWORD dwLocalPort; DWORD dwOwningPid; } MIB_UDPROW_OWNER_PID, *PMIB_UDPROW_OWNER_PID; ![]() Deine Auslegung:
Delphi-Quellcode:
Aber sollte es nicht eher so ausschauen?
MIB_UDPROW_OWNER_PID = packed record
dwState: DWORD; dwLocalAddr: DWORD; dwLocalPort: DWORD; dwRemoteAddr: DWORD; dwRemotePort: DWORD; dwOwningPid: DWORD; end;
Delphi-Quellcode:
This table entry is specifically returned by a call to GetExtendedUdpTable
MIB_UDPROW_OWNER_PID = packed record
// dwState: DWORD; dwLocalAddr: DWORD; dwLocalPort: DWORD; // dwRemoteAddr: DWORD; // dwRemotePort: DWORD; dwOwningPid: DWORD; end; with the TableClass parameter set to UDP_TABLE_OWNER_PID and the ulAf parameter set to AF_INET. Und so rufst Du GetExtendedUdpTable auf:
Delphi-Quellcode:
Ich hoffe nun, daß ich nicht allzuviel Mumpitz geschrieben habe.
Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0)
Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz