![]() |
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 ![]() 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 |
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 |
AW: IDUDPClient: IP-Adresse vom Sender
Zitat:
|
AW: IDUDPClient: IP-Adresse vom Sender
Hmm..
Zitat:
Nur bei TCP kannst du auf eine eingehende Connection über dessen Port antworten (bis die Connection getrennt wird). |
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 ![]() 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. |
AW: IDUDPClient: IP-Adresse vom Sender
Zitat:
Delphi-Quellcode:
Da der Client kein Empfangsevent hat, bietet es sich an, einen Thread zu verwenden.
// 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; |
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:
kann ich einen Sender-Port angeben, wie ich jetzt festgestellt hab.
IdUDPClient.BoundIP
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. |
AW: IDUDPClient: IP-Adresse vom Sender
Zitat:
|
AW: IDUDPClient: IP-Adresse vom Sender
Zitat:
|
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:
Aber ich versteh Gedanken von jaenicke dahinter.
---------------------------
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 --------------------------- 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 12:40 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 by Thomas Breitkreuz