Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

TCPTable liefert falschen Port

  Alt 11. Jul 2004, 19:41
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.
Angehängte Dateien
Dateityp: pas iptypes.pas (1,4 KB, 9x aufgerufen)
Dateityp: pas iphlpapi.pas (460 Bytes, 12x aufgerufen)
Dateityp: pas ipfunctions.pas (1,4 KB, 11x aufgerufen)
Dateityp: zip ipmonitor.zip (21,3 KB, 19x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat