Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCPTable liefert falschen Port (https://www.delphipraxis.net/25745-tcptable-liefert-falschen-port.html)

Luckie 11. Jul 2004 19:41


TCPTable liefert falschen Port
 
Liste der Anhänge anzeigen (Anzahl: 4)
Ich bin gerade dabei und überarbeite meinen IPMonitor. Dafür benutze ich die IPHlpAPI übersetzungen von Marcel van Brakel. Nur hab eich sie jetzt etwas modifiziert, sprich, ich habe mir nur das rausgezogen, was ich brauche. Die IPs stimmen auch alle, nur die Ports sind Mist.

Hier mal mein Code:
Delphi-Quellcode:
function IpAddressToString(Addr: DWORD): string;
var
  InAddr: TInAddr;
begin
  InAddr.S_addr := Addr;
  Result := inet_ntoa(InAddr);
end;

function TCPStateToStr(status: integer): string;
begin
  status := status - 1;
  case status of
    0: result := 'closed';
    1: result := 'listen';
    2: result := 'SYN_Sent';
    3: result := 'SYN_Rcvd';
    4: result := 'established';
    5: result := 'Fin wait 1';
    6: result := 'Fin wait 2';
    7: result := 'Close wait';
    8: result := 'closing';
    9: result := 'last Ack.';
    10: result := 'time wait';
    11: result := 'delete TCB';
  end;
end;

function GetIPInfos: IPInfo;
var
  TCPTable: PMibTcpTable;
  UDPTable: PMibUdptable;
  NumEntriesTCP: DWORD;
  NumEntriesUDP: DWORD;
  dwSizeTCP: DWORD;
  dwSizeUDP: DWORD;
  i: Integer;
begin
  Setlength(result, 0);
  VVGetTcpTable(TCPTable, dwSizeTCP, True);
  NumEntriesTCP := TCPTable.dwNumEntries;
  if TCPTable <> nil then
  begin
    SetLength(result, NumEntriesTCP);
    for i := 0 to NumEntriesTCP - 1 do
    begin
      result[i].Protokoll := 'TCP';
      result[i].localIP := IpAddressToString(TCPTable^.table[i].dwLocalAddr);
      result[i].localPort := IntToStr(TCPTable^.table[i].dwLocalPort);
      result[i].remoteIP := IpAddressToString(TCPTable^.table[i].dwRemoteAddr);
      result[i].remotePort := IntToStr(TCPTable^.table[i].dwRemotePort);
      result[i].Status := TCPTable^.table[i].dwState;
    end;
  end;
  FreeMem(TCPTable, dwSizeTCP);
  VVGetUdpTable(UDPTable, dwSizeUDP, True);
  if UDPTable <> nil then
  begin
    NumEntriesUDP := UDPTable.dwNumEntries;
    SetLength(result, NumEntriesTCP + NumEntriesUDP);
    for i := NumEntriesTCP to NumEntriesTCP + NumEntriesUDP - 1 do
    begin
      result[i].Protokoll := 'UDP';
      result[i].localIP := IpAddressToString(UDPTable^.table[i].dwLocalAddr);
      result[i].localPort := IntToStr(UDPTable^.table[i].dwLocalPort);
    end;
  end;
  FreeMem(UDPTable, dwSizeUDP);
end;
Und im Anhang meine Units. Irgendwo steckt da der Wurm drinne. Ich habe schon die original Units von Marcel genommen, da stimmen die Ports auch nicht. Bei UDP kommt übrigens nur Mist raus. :roll:

Chewie 11. Jul 2004 19:51

Re: TCPTable liefert falschen Port
 
Ist nur so ne Idee, aber versuch mal die Byte-Umkehrung (Host Order in Network Order) anzuwenden (MSDN-Library durchsuchenhtons)

Luckie 11. Jul 2004 19:56

Re: TCPTable liefert falschen Port
 
Die IP Adressen stimme ja - zumindest bei TCP.

Chewie 11. Jul 2004 20:22

Re: TCPTable liefert falschen Port
 
Bei der IP-Adresse hatte ich noch nie Probleme mit der Byte Order.

Luckie 11. Jul 2004 21:26

Re: TCPTable liefert falschen Port
 
So, ersteres Problem mit den Ports ist gelöst:
Code:
result[i].localPort := IntToStr([b]ntohs[/b](Word(TCPTable^.table[i].dwlocalPort)));
Die fehlerhaften IP Adressen bei UDP bleiben noch.

c113plpbr 12. Jul 2004 16:20

Re: TCPTable liefert falschen Port
 
beim port sollte dir htons weiterhelfen
den host musst kannst du warscheinlich mit GetHostByAddr rausfinden. Über den Hostnamen kannst du dann theoretisch die IP-rausfinden.

ciao, Philipp

shmia 12. Jul 2004 16:41

Re: TCPTable liefert falschen Port
 
Das Fehlerhandling in VVGetTcpTable & VVGetUdpTable erscheint mir noch etwas zu schwach.
Delphi-Quellcode:
procedure VVGetTcpTable(var pTcpTable: PMibTcpTable; var dwSize: DWORD;
  const bOrder: BOOL);
var
  Res: DWORD;
begin
  ....
    Res := GetTcpTable(pTcpTable, dwSize, bOrder);
  end;
  (* alt
  if Res <> NO_ERROR then
    exit;
  *)
  // neu
  case res of
     ERROR_NOT_SUPPORTED : raise EWin32Error.Create('GetTcpTable not supported');
     ERROR_INVALID_PARAMETER : raise EWin32Error.Create('GetTcpTable: invalid parameter');
  else
     raise EWin32Error.CreateResFmt(@SWin32Error, [Res, SysErrorMessage(Res)])
  end;
end;

Luckie 12. Jul 2004 17:05

Re: TCPTable liefert falschen Port
 
@shimia: Das war Absicht, da ich die SysUtils rausschmeißen wollte. Ganz befriedigt michmeine Lösung auch noch nicht. Im Original entspricht die Fehlerbehandlung in etwa deiner Version.

@c113plpbr: Ja, das könnte ich probieren mit htons. Aber wie soll ich die IP auflösen und wieder zurück, wenn ich nur Schrott bekomme?

Chewie 12. Jul 2004 17:13

Re: TCPTable liefert falschen Port
 
Zitat:

Zitat von Luckie
@c113plpbr: Ja, das könnte ich probieren mit htons. Aber wie soll ich die IP auflösen und wieder zurück, wenn ich nur Schrott bekomme?

Du benutzt ja schon htons bei dem Port, Luckie. htons und ntohs sind ja identisch: Beide Funktionen kehren die Byte-Order eines 16Bit-Wortes um. Die Unterscheidung dient nur der besseren Verständlichkeit. Network Order ist halt eine bestimmte Reihenfolge und Host Order die andere. Mehr Möglichkeiten gibt es nicht.
Das Pendant für 32Bit heißt htonl bzw. ntohl, versuch mal, das auf deine falsche IP-Adresse loszulassen. Warum du das tun musst, weiß ich auch nicht, aber vielleicht funktionierts ja...

Luckie 12. Jul 2004 17:46

Re: TCPTable liefert falschen Port
 
So richtig was gebracht hat das auch nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.
Seite 1 von 2  1 2      

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