Entwickler-Ecke

Internet / Netzwerk - IdUDPClient - Daten empfangen ?


OlafSt - Fr 13.11.09 17:48
Titel: IdUDPClient - Daten empfangen ?
Hallo Leute,

ich seh mal wieder den Wald nicht...

Simples Problem: Ich will mit einer Anwendung kommunizieren via UDP. Ich benutze hier Delphi2009 und Indy10, ergo eine TIdUDPClient-Kompo.

Daten senden an die andere Anwendung funktioniert wunderbar. Doch diese Anwendung schickt mir eine Antwort zurück - die ich nie erhalte.
Da es keine Events im TIdUDPClient gibt, die mir signalisieren, das ich was bekommen habe, polle ich per Timer-Event. Aber ich erhalte nie Daten. Was mache ich falsch ?

Wenn Verweise auf andere UDP-Komponenten als Indy10, dann nur welche, die auch mit D2009 laufen ;)

Die entscheidenden Codestellen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
//Schalte unsere Lampe auf grün, wenn Verbindung ok
procedure TTUT_Main.IdUDPClient1Connected(Sender: TObject);
begin
     IPStatus.FillColor:=clLime;
end;

//Lampe auf rot, wenn Verbindung weg
procedure TTUT_Main.IdUDPClient1Disconnected(Sender: TObject);
begin
     IPStatus.FillColor:=clRed;
end;

//Anzeige der Stati, die Indy uns mitteilt (Kommt eh nur Connect, Disconnect, Resolve etcpp)
procedure TTUT_Main.IdUDPClient1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string);
begin
     RzMemo1.Lines.Add('UDPClient: '+AStatusText);
end;

//Polling des UDP. Der Timer läuft alle 100ms hier durch - es kommt nur nie was an :-(
procedure TTUT_Main.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes; ABinding: TIdSocketHandle);
var
   s: string;
   i: integer;
begin
     s:='';
     for i := 0 to Length(AData) - 1 do
         s:=s+chr(AData[i]);
     RzMemo1.Lines.Add('Received: '+s);
end;


Xentar - Sa 14.11.09 00:29

Mich würde ja mal schwer der Aufruf interessieren, wie du ihn aus dem Timer heraus gestaltest..

Delphi-Quelltext
1:
procedure TTUT_Main.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes; ABinding: TIdSocketHandle);                    

und vor allem, was du als Parameter übergibst..


OlafSt - Mo 16.11.09 10:03

Oh... Das UDPServerRead ist ein Relikt aus der Testphase und nur mehr ein ignorierenswerter Trümmer.

Der Timer-Event sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TTUT_Main.Timer1Timer(Sender: TObject);
var
   s: string;
begin
     if not IDUDPClient1.Connected then exit;

     s:=IdUDPClient1.ReceiveString(10);
     if s='' then exit;
     RzMemo1.Lines.Add('Received: '+s);

end;


Nersgatt - Mo 16.11.09 10:29

Crossposts bitte markieren:
http://www.delphipraxis.net/topic168548_udp+indy10+daten+austauschen.html&highlight=


Xentar - Mo 16.11.09 10:39

Aber der Client ist verbunden, und es werden auch Daten hingeschickt? Sicher?


OlafSt - Mo 16.11.09 12:10

Ja, das ist er. Ich sehe auf der anderen Seite ja auch, wie meine Daten ankommen.

Nur die zurückgeschickte Antwort kommt nie an. Möglicherweise ist ja auch am anderen Ende was falsch (ist ein 30-Sekunden-Hack, den ich zusammengeschustert habe. Nur ein TIdUDPServer aufs Formular geschubst und ein UDPRead-Eventhandler gebastelt):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TBytes; ABinding: TIdSocketHandle);
var
  i: Integer;
  s: string;
begin
     s:='';
     //Nicht sehr effizient  ich weiß ;)
     for i := 0 to Length(AData)-1 do
         s:=s+chr(AData[i]);
     Memo1.Lines.Add(Format('Received from %s:%d: %s',[ABinding.PeerIP, ABinding.PeerPort, s]));

     ABinding.SendTo(ABinding.Peerip, ABinding.PeerPort, AData); //Just return the data
end;