AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Salat im UDPTable

Ein Thema von Harry M. · begonnen am 4. Jan 2007 · letzter Beitrag vom 4. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#1

Salat im UDPTable

  Alt 4. Jan 2007, 08:36
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

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.
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Salat im UDPTable

  Alt 4. Jan 2007, 13:29
Delphi-Quellcode:
PMIB_UDPROW_OWNER_PID = ^MIB_UDPROW_OWNER_PID;

pUdpTable: PMIB_UDPTABLE_OWNER_PID;
Könnte es damit zusammenhängen, das pUpdTable ein Pointer auf MIB_...
ist und pUpdTable nie instantiiert wurde. (pUdpTable:=Nil;)

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#3

Re: Salat im UDPTable

  Alt 4. Jan 2007, 13:46
Hallo Klaus,

meiner Auffassung wird pUdpTable durch die Funktion GetExtendedUdpTable inizalisiert.
Die Anzahl der Einträge ist ja auch korrekt.
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Salat im UDPTable

  Alt 4. Jan 2007, 13:57
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
Klaus
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#5

Re: Salat im UDPTable

  Alt 4. Jan 2007, 14:01
Du brauchst auf jeden Fall Windows XP...

@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...
Angehängte Dateien
Dateityp: zip netstatex_891.zip (43,4 KB, 20x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#6

Re: Salat im UDPTable

  Alt 4. Jan 2007, 14:56
@Daniel G:
Das sieht schonmal sehr sehr gut aus.
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.
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Salat im UDPTable

  Alt 4. Jan 2007, 15:05
Hier w2k und zuhause XP mit allen Patchen.
Werde es heute abend einmal zuhause testen.

Fehlermeldung habe ich angehängt.

Grüße
Klaus
Miniaturansicht angehängter Grafiken
error_message_449.gif  
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#8

Re: Salat im UDPTable

  Alt 4. Jan 2007, 15:29
@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"
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#9

Re: Salat im UDPTable

  Alt 4. Jan 2007, 16:43
Zitat von Harry M.:
@Daniel G: Die Unit ist Klasse! Das bekomm ich jetzte zum laufen! Danke vielmals.
PS: Dein Net-Mon hab ich auch gleich "gesavt"
Gern geschehen.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Salat im UDPTable

  Alt 4. Jan 2007, 20:50
Guten Abend,


Code:
typedef struct {
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwOwningPid;
} MIB_UDPROW_OWNER_PID,
 *PMIB_UDPROW_OWNER_PID;
Quelle: -> http://msdn2.microsoft.com/en-us/library/aa366928.aspx

Deine Auslegung:
Delphi-Quellcode:
  MIB_UDPROW_OWNER_PID = packed record
    dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
Aber sollte es nicht eher so ausschauen?
Delphi-Quellcode:
  MIB_UDPROW_OWNER_PID = packed record
  // dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
   // dwRemoteAddr: DWORD;
   // dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
This table entry is specifically returned by a call to GetExtendedUdpTable
with the TableClass parameter set to UDP_TABLE_OWNER_PID and the ulAf parameter set to AF_INET.

Und so rufst Du GetExtendedUdpTable auf:

Res := pGetExtendedUdpTable(pUdpTable, @dwSize, True, AF_INET, UDP_TABLE_OWNER_PID_ALL, 0) Ich hoffe nun, daß ich nicht allzuviel Mumpitz geschrieben habe.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz