Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Aus IP und Port wieder DWord machen (https://www.delphipraxis.net/83879-aus-ip-und-port-wieder-dword-machen.html)

Kanne_Kaffe 7. Jan 2007 21:24


Aus IP und Port wieder DWord machen
 
Nabend

ich weiss gab es schon öfter, verstehen tu ich es trotzdem leider nicht :?
Ich möchte auch einer IP und Port wieder einen Dword Wert erhalten die richtigen functionen habe ich, denke ich, nur versteh ich deren Anwendung nicht ganz:
Delphi-Quellcode:
// (String) IP -> DWord
function GetAddress(FIpAdress: String): DWORD;
begin
  Result := Inet_addr(@FIpAdress[1]);
end;

// (Integer) Port -> Dword
function GetPort(FPort: Integer): DWORD;
begin
  Result := WinSock.htonl(FPort);
end;
Was habe ich hier falsch gemacht?

Christian Seehase 7. Jan 2007 21:59

Re: Aus IP und Port wieder DWord machen
 
Moin Kanne_Kaffe,

inet_addr liefert die Bytes in umgekehrter Reihenfolge wieder zurück.
Ist das das Problem?

Kanne_Kaffe 7. Jan 2007 22:14

Re: Aus IP und Port wieder DWord machen
 
Hallo Christian,

Nein, denke ich jedenfalls nicht.

Ich will eigendlich eine TCP verbidung beenden. Unddabei kommt es zur AV
Delphi-Quellcode:

type
  TSetTcpEntry= Function(pTcpRow: PMIB_TCPROW): DWORD; stdcall;

type
  MIB_TCPROW = packed record
    dwState,
    dwLocalAddr,
    dwLocalPort,
    dwRemoteAddr,
    dwRemotePort: DWORD;
  end;
  PMIB_TCPROW = ^MIB_TCPROW;

function CloseTCPConnection(pTcpRow: PMIB_TCPROW): Boolean;
begin
   pTcpRow.dwState := MIB_TCP_STATE_DELETE_TCB;
   if pSetTcpEntry(pTcpRow) = NO_ERROR then
    Result := True
   else
    Result := False;
end;

function TForm1.GetTCPRow: PMIB_TCPROW;
var
  I, X: Integer;
  S, sLocalIp, sRemoteIp: String;
  iLocalPort, iRemotePort: Cardinal;
begin
  if ListView1.ItemIndex = -1 then exit;
  S := ListView1.Items.Item[ListView1.ItemIndex].SubItems[1];
  X := Pos(':', S);
  sLocalIp := Copy(S, 1, X-1);
  iLocalPort := StrToInt( Copy(S, X+1, Length(S)) );

  S := ListView1.Items.Item[ListView1.ItemIndex].SubItems[2];
  X := Pos(':', S);
  sRemoteIp := Copy(S, 1, X-1);
  iRemotePort := StrToInt( Copy(S, X+1, Length(S)) );

  Result.dwLocalAddr := GetAddress(PAnsiChar(sLocalIp)); // und hier kommt die AV
  Result.dwLocalPort := GetPort(iLocalPort);            // functionen wie oben geschrieben
  Result.dwRemoteAddr := GetAddress(PChar(sRemoteIp));
  Result.dwRemotePort := GetPort(iRemotePort);
end;

procedure TForm1.Schliessen1Click(Sender: TObject);
begin
  if CloseTCPConnection(GetTCPRow) then
    showmessage('Verbindung geschlossen')
    else
    showmessage('Fehler');
end;

Klaus01 8. Jan 2007 07:47

Re: Aus IP und Port wieder DWord machen
 
Kann es sein , da PMIB_TCPROW ein Zeiger auf MIB_TCPROW ist
und moch kein Speicher alokiert wurde es kracht wenn Du in den Speicher schreiben möchtest?

Grüße
Klaus

Kanne_Kaffe 8. Jan 2007 08:38

Re: Aus IP und Port wieder DWord machen
 
Das kann gut sein. Was muss ich verwenden. GetMem oder AllocMem und wie muss ich das Deklarieren TSockAddr oder so - das ist glaub ich mein Problem.

Klaus01 8. Jan 2007 08:44

Re: Aus IP und Port wieder DWord machen
 
Bin mir da nicht 100% sicher, aber ich würde es mit new(PMIB_TCPROW) probieren.
Um keine Speicherfresser zu produzieren sollte der Speicher dann wieder, wenn er nicht mehr gebraucht wird
mit dispose(PMIB_TCPROW) freigeben werden.

Grüße
Klaus

Kanne_Kaffe 8. Jan 2007 08:54

Re: Aus IP und Port wieder DWord machen
 
Es kommt nicht zur AV bei der Verwendung von ColoseConnection. Soweit bin ich noch gar nicht.
Wenn ich die function GetAddress wie ober beschrieben verwende kommt es zu AV.

Klaus01 8. Jan 2007 08:57

Re: Aus IP und Port wieder DWord machen
 
Was passiert denn wenn Du hier:

Delphi-Quellcode:
 Result.dwLocalAddr := GetAddress(PAnsiChar(sLocalIp)); // und hier kommt die AV
  Result.dwLocalPort := GetPort(iLocalPort);            // functionen wie oben geschrieben
  Result.dwRemoteAddr := GetAddress(PChar(sRemoteIp));
  Result.dwRemotePort := GetPort(iRemotePort);
einfach einen dummy Wert zum Testen zuweist und nicht Deine Funktionen aufrufst ?

Grüße
Klaus

Kanne_Kaffe 8. Jan 2007 09:17

Re: Aus IP und Port wieder DWord machen
 
Hier war was faul:
Delphi-Quellcode:
Falsch^^
function GetPort(FPort: Integer): DWORD;
begin
  Result := WinSock.htonl(FPort);
end;

// richtig ist...
function GetPort(FPort: Integer): DWORD;
begin
  Result := WinSock.ntohs(FPort);
end;
Aber gehen tut es leider immer noch nicht.
Delphi-Quellcode:
  iTmp := GetAddress(PAnsiChar(sLocalIp));
  Result.dwLocalAddr := iTmp; // hier knalls
iTmp ist Cadinal... Es Geht nicht.

Aber ich weiss jetzt das meine funtionen in ordnung sind, weil ich im "Hin-Und-Her-Modus" die richtigen Ergebnisse bekomme nur lässt es sich nicht dwLocalAdress zuweisen.

Kanne_Kaffe 8. Jan 2007 09:38

Re: Aus IP und Port wieder DWord machen
 
Freudentanz es geht!
hier war das Problem:
Delphi-Quellcode:
  GetMem(Result, SizeOf(Result));
Das fehle in meiner function!
Danke für die Denkanstösse!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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