Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IDUDPClient: IP-Adresse vom Sender (https://www.delphipraxis.net/216351-idudpclient-ip-adresse-vom-sender.html)

Helmi 15. Dez 2024 10:33

IDUDPClient: IP-Adresse vom Sender
 
Hallo Zusammen,

ich nutze die Indy Komponente "IdUDPClient", um einen String an einen ESP32 zu schicken.
Dafür nutz ich neben der IP des ESP32 den Port 8888.
Alles soweit so gut.

Auf der Empfängerseite bekomm ich die Infos, dass an die IP-Adresse des ESP32 + Port 8888 gesendet wurde und zwar vom Sender (meiner Rechner-IP) mit dem Port 58467.

Nun würd ich gerne an meine Rechner-IP, an den Port 58467, Daten zurückschicken.
Aktuell nehm ich dazu einfach den Sende-Port plus eins (8889).

Ich habe noch keine Möglichkeit gefunden, über die Indy-Komponente rausfinden zu können, wie ich an den Port 58467 komme.
Denn dann könnte ich diesen Port auch für die Verbindung vom ESP32 zu meinem Programm verwenden zu können.

Testweise nehme ich auch die SW https://packetsender.com/, anstatt mein Programm und dort erhalte ich auch die Sender-Port-Nr. 58467

Gibt es eine Möglichkeit an die Port-Nr. zu kommen und falls ja, wie?
Vor allem, da sich diese Port-Nr. nach jedem Verbindungsaufbau ggf. anders sein kann

Klaus01 15. Dez 2024 11:08

AW: IDUDPClient: IP-Adresse vom Sender
 
.. UDP baut keine Verbindung auf, es sendet Daten ohne Kenntnis ob die Daten ankommen oder nicht.
Wenn Du eine Bidirectionale Verbindung haben willst, solltest Du TCP (Client/Server) verwenden.

Grüße
Klaus

Helmi 15. Dez 2024 11:53

AW: IDUDPClient: IP-Adresse vom Sender
 
Zitat:

Zitat von Klaus01 (Beitrag 1544229)
.. UDP baut keine Verbindung auf, es sendet Daten ohne Kenntnis ob die Daten ankommen oder nicht.
Wenn Du eine Bidirectionale Verbindung haben willst, solltest Du TCP (Client/Server) verwenden.

Grüße
Klaus

Dem bin ich mir bewusst und hab absichtlich UDP dafür verwendet

HolgerX 15. Dez 2024 21:22

AW: IDUDPClient: IP-Adresse vom Sender
 
Hmm..

Zitat:

Zitat von Helmi (Beitrag 1544234)
Zitat:

Zitat von Klaus01 (Beitrag 1544229)
.. UDP baut keine Verbindung auf, es sendet Daten ohne Kenntnis ob die Daten ankommen oder nicht.
Wenn Du eine Bidirectionale Verbindung haben willst, solltest Du TCP (Client/Server) verwenden.

Grüße
Klaus

Dem bin ich mir bewusst und hab absichtlich UDP dafür verwendet

Dann kommst Du um einen UDP-Server nicht herum, welcher auf einen festen Port (z.B. 8889) lauscht!

Nur bei TCP kannst du auf eine eingehende Connection über dessen Port antworten (bis die Connection getrennt wird).

himitsu 15. Dez 2024 22:15

AW: IDUDPClient: IP-Adresse vom Sender
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jupp, UDP sendet, ohne dass es im Protokoll eine Rückantwort gibt.
Ob es überhaupt empfangen und verarbeitet wurde und wenn man Daten als Antwort zurück senden will, darum muß man sich dann selber in der Anwendungsebene kümmern.
Drum will man ja auch HTTP auf UDP umstellen, um so den Transfer im Internet zu beschleunigen, weil nicht jede Zwischenstelle auf Empfangsbestätigungen usw. warten muß ... TCP-Handshake. (HTTP/3 mit Bei Google suchenQUIC)


Eigentlich sollte doch im UDP-Header der Quell- und Ziel-Port drin stehen? :gruebel:
Bei der Sender-IP bin ich mir nur nicht sicher.
[edit] Doch, die auch ... jedenfalls im IP-Header darüber mit enthalten.
Anhang 57286
Somit müsste es doch eine Möglichkeit geben, sich diese Info ausgeben zu lassen. :)

Und es dürfte auch OK sein, wenn auf beiden Seiten der selbe gleiche Port genutzt wird, um Daten zurückzuschicken.

jaenicke 16. Dez 2024 00:18

AW: IDUDPClient: IP-Adresse vom Sender
 
Zitat:

Zitat von HolgerX (Beitrag 1544260)
Dann kommst Du um einen UDP-Server nicht herum, welcher auf einen festen Port (z.B. 8889) lauscht!

Nur bei TCP kannst du auf eine eingehende Connection über dessen Port antworten (bis die Connection getrennt wird).

Das stimmt nicht. Hole Punching (Firewall), Antworten usw. funktioniert auch problemlos mit UDP. Das sollte so direkt funktionieren:
Delphi-Quellcode:
// Server:
  UDPServer.DefaultPort := 9999;
  UDPServer.Active := True;
  UDPServer.OnUDPRead := UDPServerUDPRead;

procedure TFormExample.UDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, 'Test');
end;

// Client:
var
  UdpClient: TIdUDPClient;
  ReceivedData: string;
begin
  UdpClient := TIdUDPClient.Create(nil);
  try
    UdpClient.Host := '127.0.0.1';
    UdpClient.Port := 9999;
    UdpClient.Active := True;

    UdpClient.Send('Hallo Welt');

    ReceivedData := UdpClient.ReceiveString(5000);
    if ReceivedData <> '' then
      ShowMessage('Antwort: ' + ReceivedData)
    else
      ShowMessage('Keine Antwort erhalten.');
  finally
    UdpClient.Free;
  end;
end;
Da der Client kein Empfangsevent hat, bietet es sich an, einen Thread zu verwenden.

Helmi 16. Dez 2024 07:02

AW: IDUDPClient: IP-Adresse vom Sender
 
Hallo Zusammen,

Danke für die Antworten.

Ich hatte mich damals für UDP entschieden, da ich nur Text zum ESP schicken will, ohne eine Abhängigkeit zu schaffen.
Mein (Delphi-)Programm schickt, egal ob der andere auf Empfang ist oder nicht.
Wenn der andere empfangsbereit ist, dann nimmt er die Daten an, wenn nicht, dann nicht.
Die Daten können von meinem Programm kommen, aber auch von anderen UDP-Sendern.

Dabei handelt es sich um eine Tankanzeige für eine Modelleisenbahn (Spur N, falls es jemanden interessiert).
Ein OLED-Display hängt dabei an einem ESP, dass die Preise anzeigt (und noch vieles mehr).
Bei den Daten handelt es sich u. a. um Preise (die Preise hol ich mir im Delphi-Programm aus dem Internet).
Daher ist es egal, ob ein Datensatz mal mitbekommen wird oder nicht.

Der ESP sendet per UDP nur zurück, wenn er Fehler in den Daten festgestellt hat (weil z. B. das Format nicht stimmt).
Aber auch das ist nicht tragisch, wenn es nicht ankommt.

Über
Delphi-Quellcode:
IdUDPClient.BoundIP
kann ich einen Sender-Port angeben, wie ich jetzt festgestellt hab.
Der scheint aber dann belegt zu sein.
Ist dies 0, so wird ein Port "gewürfelt" (ja, bitte nicht erschlagen - da ist ein System dahinter).

Bin jetzt wieder auf einen festen Port zum Senden gegangen: Empfangsport + 1, also 8889.

Olli73 16. Dez 2024 07:39

AW: IDUDPClient: IP-Adresse vom Sender
 
Zitat:

Zitat von Helmi (Beitrag 1544264)
Über
Delphi-Quellcode:
IdUDPClient.BoundIP
kann ich einen Sender-Port angeben, wie ich jetzt festgestellt hab.
Der scheint aber dann belegt zu sein.

Geht denn das was Jaenicke gepostet hat nicht?

Helmi 16. Dez 2024 07:44

AW: IDUDPClient: IP-Adresse vom Sender
 
Zitat:

Zitat von Olli73 (Beitrag 1544265)
Zitat:

Zitat von Helmi (Beitrag 1544264)
Über
Delphi-Quellcode:
IdUDPClient.BoundIP
kann ich einen Sender-Port angeben, wie ich jetzt festgestellt hab.
Der scheint aber dann belegt zu sein.

Geht denn das was Jaenicke gepostet hat nicht?

Hab ich noch nicht ausprobiert - mach ich später, wenn die Arbeit es zulässt

Helmi 16. Dez 2024 08:34

AW: IDUDPClient: IP-Adresse vom Sender
 
Hab jetzt mal ein kleines Testprogramm gebastelt.

Zum vom Client einfach einen Button genommen und zum Empfangen testweise nen Timer.

Aber wenn Server und Client beide die gleichen Daten haben, dann erhalte ich folgende Fehlermeldung beim aktivieren:

Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EIdCouldNotBindSocket mit der Meldung 'Socket konnte nicht gebunden werden. Adresse und Port werden bereits verwendet.' aufgetreten.
---------------------------
Anhalten  Fortsetzen  Hilfe  
---------------------------
Aber ich versteh Gedanken von jaenicke dahinter.

Ich werd das später mal in Verbindung mit dem ESP ausprobieren.
Also im Delphi-Programm keinen Server, nur einen Client und den ReceiveString davon abfragen.
(mit nur noch einem Port)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:00 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz