AGB  ·  Datenschutz  ·  Impressum  







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

GetExtendedTcpTable

Ein Thema von Harry M. · begonnen am 13. Nov 2006 · letzter Beitrag vom 13. Nov 2006
Antwort Antwort
Benutzerbild von Harry M.
Harry M.

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

GetExtendedTcpTable

  Alt 13. Nov 2006, 00:22
Hallöchen..

Ich möchte alle Verbindungen (zunächst erstmal nur TCP) und die dazugehörige PID ermitteln.
Das habe ich bis jetzt
Delphi-Quellcode:
program Endpoints;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

const
  ANY_SIZE = 1;

type
  MIB_TCPROW_OWNER_PID = packed record
    dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
  PMIB_TCPROW_OWNER_PID = MIB_TCPROW_OWNER_PID;

type
  MIB_TCPTABLE_OWNER_PID = packed record
    dwNumEntries: DWord;
    table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ;
    end;
  PMIB_TCPTABLE_OWNER_PID = MIB_TCPTABLE_OWNER_PID;

const
  TCP_TABLE_OWNER_PID_ALL = 5;
  AF_INET = 0;

type
  TCP_TABLE_CLASS = Integer;
  ULONG = Integer;

function GetExtendedTcpTable(pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL;
  lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall; external 'iphlpapi.dllname 'GetExtendedTcpTable'; // TCP Table + PID

var
  pTcpTable: PMIB_TCPTABLE_OWNER_PID;
  dwSize: PDWord;
  Res: Dword;
  I: Integer;
begin
  Res := GetExtendedTcpTable(@pTcpTable, dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); // False = unsortiert

  for I := 0 to pTcpTable.dwNumEntries do
    writeln( IntToStr(pTcpTable.table[I].dwOwningPid) );
end.
pTcpTable.dwNumEntries ist immer 0.
Ich vermute den Fehler in den Deklarationen kann das sein??

MSDN-Link: http://msdn.microsoft.com/library/de...edtcptable.asp
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#2

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 06:15
siehe Kommentare
Delphi-Quellcode:
type
  // hier fehlt das ^ vor dem MIB_TCPROW_OWNER_PID
  PMIB_TCPROW_OWNER_PID = ^MIB_TCPROW_OWNER_PID;
  PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID;

Const
  AF_INET = 2; // 2, nicht 0, wäre in WinSock definiert

var
  pTcpTable: PMIB_TCPTABLE_OWNER_PID;
  dwSize: DWord; // DWORD reicht, kein Pointer, sonst müsste man ja noch selber Platz dafür allozieren
  Res: Dword;
  I: Integer;
begin
  pTcpTable:=Nil;
  Try
    // hier ist ein @ zuviel, pTcpTable ist ja schon Pointer... dafür fehlt eines vor dwSize...
    // weiter erwartet das API, dass du bereits Speicher alloziert hast, bzw. üblicherweise macht man das so:
    dwSize:=0;
    Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
    If (Res = ERROR_INSUFFICIENT_BUFFER) Then Begin
      GetMem(pTCPTable,dwSize); // das API hat die "gewünschte" Grösse gesetzt
      Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
    end;

    If not (Res = NO_ERROR) Then raiseLastOSError(); // Error-Handling
  
    // dies ruft nach Access Violation 0..n sind n+1 Elemente, hat aber nur n => 1..n oder 0..n-1
    for I := 1 to pTcpTable.dwNumEntries do
      writeln( IntToStr(pTcpTable.table[I - 1].dwOwningPid) );
  Finally
    If (pTcpTable <> Nil) Then FreeMem(pTcpTable);
  end;
end.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#3

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 06:22
Zitat von Basilikum:
// hier ist ein @ zuviel, pTcpTable ist ja schon Pointer...
Denkste, sieh mal sein Deklaration an.

Der Fehler ist noch an einer anderen (mir unbekannten) Stelle. Bei mir kommt der Error 87 ("Falscher Paramter").

Hast du deinen Code mal ausprobiert Basilikum?
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#4

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 06:38
Zitat von chaosben:
Zitat von Basilikum:
// hier ist ein @ zuviel, pTcpTable ist ja schon Pointer...
Denkste, sieh mal sein Deklaration an.
doch doch, das stimmt schon... aber vor dwSize fehlt ein @, wie ich jetzt gerade festgestellt habe... in meiner Implementation ist dwSize als VAR-Parameter, bei Harry jedoch als Pointer...

Zitat von chaosben:
Der Fehler ist noch an einer anderen (mir unbekannten) Stelle. Bei mir kommt der Error 87 ("Paramter stimmt nicht").
dies dürfte wegen dem fehlenden @ vor dwSize passieren...

Zitat von chaosben:
Hast du deinen Code mal ausprobiert Basilikum?
jep, die von mir geposteten Zeilen stammt aus einer meiner Anwendungen... zugegeben, im Gesamtzusammenhang habe ich es nicht getestet... deshalb der Fehler mit dem @ vor dwSize...
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 06:44
Zitat von Basilikum:
dies dürfte wegen dem fehlenden @ vor dwSize passieren...
Das kann nicht sein, denn ich habe mir einen "echten" DWord-Pointer "gemacht" und ihn mit New und Dispose "behandelt". An den Paramter-Typen kann es nicht liegen. (garantiert )
Delphi-Quellcode:
const
  ANY_SIZE = 1;

type
  MIB_TCPROW_OWNER_PID = packed record
    dwState: DWORD;
    dwLocalAddr: DWORD;
    dwLocalPort: DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
    dwOwningPid: DWORD;
    end;
  PMIB_TCPROW_OWNER_PID = ^MIB_TCPROW_OWNER_PID;

type
  MIB_TCPTABLE_OWNER_PID = packed record
    dwNumEntries: DWord;
    table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ;
    end;
  PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID;

const
  TCP_TABLE_OWNER_PID_ALL = 5;
  AF_INET = 0;

type
  TCP_TABLE_CLASS = Integer;
  ULONG = Longword;

function GetExtendedTcpTable(pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL;
  lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall; external 'iphlpapi.dllname 'GetExtendedTcpTable'; // TCP Table + PID

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  pTcpTable: PMIB_TCPTABLE_OWNER_PID;
  dwSize: PDWord;
  Res: Dword;
  I: Integer;
begin
  New(pTcpTable);
  New(dwSize);

  dwSize^:=SizeOf(MIB_TCPTABLE_OWNER_PID);

  Res := GetExtendedTcpTable(pTcpTable, dwSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); // False = unsortiert

  if Res<>NO_ERROR then
    raise Exception.Create(SysErrorMessage(Res));

  for I := 0 to pTcpTable.dwNumEntries do
    writeln( IntToStr(pTcpTable.table[I].dwOwningPid) );

  dispose(dwSize);
  dispose(pTcpTable);
end;

end.
Ich denke es liegt eher an den Werten. Leider finde ich weder im Plattform-SDK noch im Web etwas dazu.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#6

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 06:52
@chaosben: siehe oben, jetzt auch wirklich komplett getestet...

AF_INET müsste 2 sein, nicht 0 (WinSock)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 06:54
Zitat von Basilikum:
AF_INET müsste 2 sein, nicht 0 (WinSock)
Na bitte, da haben wir den Schuldigen. Danke.

Und damit müsste auch das Problem des Thread-Autors gelöst sein.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

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

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 09:49
Das sieht schon mal sehr gut aus. Was soll ich noch sagen....!? Danke Jungs!
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#9

Re: GetExtendedTcpTable

  Alt 13. Nov 2006, 09:53
Zitat von chaosben:
Zitat von Basilikum:
AF_INET müsste 2 sein, nicht 0 (WinSock)
Na bitte, da haben wir den Schuldigen. Danke.

Und damit müsste auch das Problem des Thread-Autors gelöst sein.
Nicht ganz.

Delphi-Quellcode:
  MIB_TCPTABLE_OWNER_PID = packed record
    dwNumEntries: DWord;
    table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ;
  end;
"table" ist als Array deklariert, damit man alle Verbindungen ansprechen kann, allerdings stimmt die Größe nicht immer, sondern nur in dem Fall, dass es exakt eine TCP-Verbindung gibt.

Um den Zugriff dynamisch zu gestalten wird der Array an der Stelle dynamsich erzeugt, d.h. es können (theoretisch) 0 bis N Element vorhanden sein.

Unter C ist das Ganze kein Problem, da es dort keine Informationen über Array-Größen gibt und man über "pTcpTable.dwNumEntries" weiss, wie viele Element der Array hat.

Unter Delphi geht es nicht so einfach.
Eine Möglichkeit ist es, sich einen typisierten Pointer ("PMIB_TCPROW_OWNER_PID") lokal anzulegen und durch den Speicher zu wandern, bis man alle Elemente erhalten hat.

Delphi-Quellcode:
var
  pTable: PMIB_TCPROW_OWNER_PID;
  i: DWORD;
begin

  ...

      pTable := @pTcpTable.Table;
      i := 0; // i dient als Index
      while (i <= pTcpTable.dwNumEntries) do
      begin

        ...

        Inc(i);
        Inc(pTable); // typisierte Pointer werden direkt um "sizeof(Type)" Byte weitergesetzt
      end;
Eine andere Möglichkeit wäre es, selbst einen danamischen Array anzulegen mit "pTcpTable.dwNumEntries" Elementen und den erhaltenen Array dort hinein zu kopieren.
Array wieder freigeben! ("Finalize(MeinArray);")
Dann kann der Zugriff wie gewohnt über eine For-Schleife erfolgen.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:48 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