Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy10] Fehler beim senden mit UDP - Daten kommen zurück (https://www.delphipraxis.net/151226-%5Bindy10%5D-fehler-beim-senden-mit-udp-daten-kommen-zurueck.html)

emteg 9. Mai 2010 22:29


[Indy10] Fehler beim senden mit UDP - Daten kommen zurück
 
Ich habe hier grade ein merkwürdiges und asymmetrisches problem: Ich versuche per UDPClient.Send() einen String an einen Host zu senden. Am anderen Ende kommt nichts an, dafür geht aber sofort auf der sender-seite die UDPServer.OnRead methode auf und erhält die daten, die ich grade gesendet habe. Außerdem behauptet der UDPServer noch, dass die daten von der IP kommen, wo sie eigentlich hin sollten.

Server und client sind broadcast enabled, broadcasts kommen auch in beide richtungen problemlos an.

Delphi-Quellcode:
// Senden
procedure TConnection.Send(Msg, IP: String);
begin
  FUDPClient.Host := IP;
  FUDPClient.Send(Msg);
end;

//Empfangen
procedure TConnection.OnUDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
  ABinding: TIdSocketHandle);
var
  i: integer;
  s: String;
begin
  s := '';

  for i := 0 to Length(AData) - 1 do
    s := s + Chr(AData[i]);

  // << Tue Dinge mit s >>
end;
Jetzt wirds noch ne stufe merkwürdiger: ich habe das gleiche problem, wenn ich das ganze über TCP versuche. Beim empfänger kommt nichts an, dafür springt sofort meine OnExecute methode an, die behauptet sie hätte daten vom zielhost empfangen.
Allerdings muss ich dazu sagen, dass ich mit dem indy10 TCP nocht nicht so ganz firm bin :)

Delphi-Quellcode:
// Senden
procedure TConnection.Send(Msg, IP: String);
begin
  FTCPClient.Host := IP;
  FTCPClient.IOHandler.Open;
  FTCPClient.IOHandler.WriteLn(Msg);
end;

// Empfangen
procedure TConnection.OnExecute(AContext: TIdContext);
var s: string;
begin
  s := AContext.Connection.IOHandler.ReadLn;

  // << Tue dinge mit s >>
end;
Ich blick da grade echt nicht mehr durch. Mache ich irgendwelche dinge bzgl. indy 10 falsch?

Klaus01 10. Mai 2010 07:37

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Guten Morgen,

hast Du auch irgendwo den Port, wo die Applikation hinsenden soll, definiert?

Grüße
Klaus

DataCool 10. Mai 2010 08:05

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Hi,

beim TCP tritt bei Dir sofort das OnExecute ein ?!
Das OnExecute gibt es nur beim TIdTCPServer, das was Du brauchst ist der TIdTCPClient.
Genau das gleiche ist bei UDP der Fall das Event OnUDPRead gibt es nur im TIdUDPServer Du brauchst aber den TIdUDPClient !

Greetz Data

emteg 11. Mai 2010 23:21

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Zitat:

Zitat von Klaus01
Guten Morgen,

hast Du auch irgendwo den Port, wo die Applikation hinsenden soll, definiert?

Grüße
Klaus

Ja

Ich hab inzwischen ne Vermutung, dass es an einer obskuren wlan konfiguration liegen könnte. Der eine PC hängt am wlan, der andere am kabel und es sind verschiedene router dazwischen. Könnte es sein, dass einer von denen die verbindung ablehnt und zurückwirft?

Mich wundert nur, dass die broadcasts durchkommen. Irgendwelche ideen?

DataCool 12. Mai 2010 07:58

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Hi,

hast Du meinen Post überhaupt gelesen ?
D asteht ganz klar wo Dein Problem liegt:

Ein Verbindungsaufbau funktioniert nur von Client ---> Server. Nicht umgekehrt !
Deshalb muss Du in Deiner Client-Applikation TIdUdpClient bzw. TIdTcpClient benutzen und im Server TIdUDPServer bzw. TIdTcpServer.
Die Ereignisse ONUDPRead/OnExecute gibt es nur bei den Serverkomponenten, nicht bei den Clientkomponenten.

Mir scheint Du hast jeweils ein TIdUdpClient und TIdUdpServer in einer Anwendung/auf Deiner Form
und möchtest vom Client zum Server(nicht der Server auf Deiner Form) senden(soweit ok).
Aber um die Antwort zum Empfangen brauchst Du keinen extra Server das funktioniert über die gleiche "Verbindung".


DAmit wir Dir bei der Lösung Deines Problems helfen können brauchen wir ein paar mehr Infos,
für den Anfang wäre eine Erklärung was Du überhaupt vorhast/erreichen wilst nicht schlecht.
Des Weiteren würde mich auch interessieren, wo Du den Port setzt und welche Portnummer Du verwendest.
Außerdem könnntest Du das ganze mal debuggen und uns mitteilen welche IP-Adressen zum verbinden verwendet werden.

Greetz Data

emteg 12. Mai 2010 08:33

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Zitat:

Zitat von DataCool
Hi,

hast Du meinen Post überhaupt gelesen ?

Ja hab ich, allerdings hab ich ihn nicht verstanden.

Zitat:

Zitat von DataCool
D asteht ganz klar wo Dein Problem liegt:

Ein Verbindungsaufbau funktioniert nur von Client ---> Server. Nicht umgekehrt !
Deshalb muss Du in Deiner Client-Applikation TIdUdpClient bzw. TIdTcpClient benutzen und im Server TIdUDPServer bzw. TIdTcpServer.
Die Ereignisse ONUDPRead/OnExecute gibt es nur bei den Serverkomponenten, nicht bei den Clientkomponenten.

Weiß ich alles. Ich frage mich jetzt, wo du darauf kommst, dass ich es anders mache. Meine anwendung kann senden (id*Client) und empfange (id*Server). Und natürlich verwende ich zum senden die client komponenten und zum lauschen die server komponenten.

Delphi-Quellcode:
FTCPClient.IOHandler.WriteLn(Msg);
FUDPClient.Send(Msg);
Zitat:

Zitat von DataCool
Mir scheint Du hast jeweils ein TIdUdpClient und TIdUdpServer in einer Anwendung/auf Deiner Form
und möchtest vom Client zum Server(nicht der Server auf Deiner Form) senden(soweit ok).
Aber um die Antwort zum Empfangen brauchst Du keinen extra Server das funktioniert über die gleiche "Verbindung".

Ja, ich weiß dass das geht, da würde man dann auf der empfänger seite sofort mit
Delphi-Quellcode:
AContext.Connection.IOHandler.WriteLn(Antwort)
oder so ähnlich antworten. In dem Protokoll muss halt nicht immer zwangsweise ne antwort zurück kommen, deshalb habe ich das bisher nicht so gelöst. Eventuell könnte ich mein programm so umschreiben, dass die antworten sofort zurückgegeben werden.

Allerdings müsste es doch trotzdem auch so funktionieren, dass man die connection zu macht und dann zum antworten ne neue aufmacht, oder?

Zitat:

Zitat von DataCool
DAmit wir Dir bei der Lösung Deines Problems helfen können brauchen wir ein paar mehr Infos,
für den Anfang wäre eine Erklärung was Du überhaupt vorhast/erreichen wilst nicht schlecht.
Des Weiteren würde mich auch interessieren, wo Du den Port setzt und welche Portnummer Du verwendest.
Außerdem könnntest Du das ganze mal debuggen und uns mitteilen welche IP-Adressen zum verbinden verwendet werden.

Greetz Data

Ich möchte ein simples text protokoll realisieren. Ich schicke strings über das netz (manchmal auch per broadcast) und eventuell kommt dann auch ne antwort zurück, eventuell auch nicht.

Die Ports habe ich direkt in den eigenschaften der komponenten angepasst und ich hab einfach mal 5000 ausgewählt, weil mir nichts besseres eingefallen ist.

Die IP adressen sind richtig, allerdings kommen die daten halt sofort zurück. Ich vermute wirklich, dass es an dieser merkwürdigen netzwerk konfig liegt, weil in einer anderen umgebung hat das ganze deutlich besser funktioniert. Da hatte ich dann eher damit ein problem, dass UDP + WLan schlecht zusammen geht ;)

Für das Netzwerkproblem spricht auch, dass das problem auch nur in eine richtung besteht.

Klaus01 12. Mai 2010 08:45

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Guten Morgen,

hat der WLAN Router (DSL Router?) irgend eine Art von Firewall?

Grüße
Klaus

DataCool 12. Mai 2010 15:07

Re: [Indy10] Fehler beim senden mit UDP - Daten kommen zurüc
 
Hi,

Zitat:

Allerdings müsste es doch trotzdem auch so funktionieren, dass man die connection zu macht und dann zum antworten ne neue aufmacht, oder?
Nein, nicht zwangsläufig ! Es Connection kann immer nur von der Client-Komponente zur Server-Komponente aufgebaut werden.

Ich versuche das mal zu veranschaulichen :

Dein Modell, soweit ich Dich verstanden habe:
PC1 PC2
Udp/Tcp-Client1 ---> connect --> schickt Kommando1 Udp/Tcp-Server2
trennt die Verbindung zu Client 1
Udp/Tcp-Server1 <--- schickt Antwort <--- connect Udp/Tcp-Client2 schickt nacht Zeitpunkt X Antwort zu Kommando 1

Damit das funktioniert müssen für den Server1 und den Server2 jeweils entsprechende Ports im Router freigeschaltet werden,
wenn das ganze nicht Lan-Intern ohne Firewall läuft.


Mein Vorschlag an Dich:
PC1 PC2
Udp/Tcp-Client1 ---> connect --> schickt Kommando1 Udp/Tcp-Server2
udp/TcpClient1 <--- schickt Antwort in gleicher Verbidung das kann auch erst nach xyz Sekunden sein

Nochmal, was willst Du damit im Endeffekt realisieren ?
In meinen Augen gibt es eigentlich keinen Grund für Variante 1!

Greetz Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz