![]() |
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:
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:
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; |
Re: TCPTable liefert falschen Port
Ist nur so ne Idee, aber versuch mal die Byte-Umkehrung (Host Order in Network Order) anzuwenden (
![]() |
Re: TCPTable liefert falschen Port
Die IP Adressen stimme ja - zumindest bei TCP.
|
Re: TCPTable liefert falschen Port
Bei der IP-Adresse hatte ich noch nie Probleme mit der Byte Order.
|
Re: TCPTable liefert falschen Port
So, ersteres Problem mit den Ports ist gelöst:
Code:
Die fehlerhaften IP Adressen bei UDP bleiben noch.
result[i].localPort := IntToStr([b]ntohs[/b](Word(TCPTable^.table[i].dwlocalPort)));
|
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 |
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; |
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? |
Re: TCPTable liefert falschen Port
Zitat:
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... |
Re: TCPTable liefert falschen Port
So richtig was gebracht hat das auch nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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