Autor Beitrag
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Fr 13.11.09 17:48 
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:

ausblenden 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;

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 14.11.09 00:29 
Mich würde ja mal schwer der Aufruf interessieren, wie du ihn aus dem Timer heraus gestaltest..
ausblenden Delphi-Quelltext
1:
procedure TTUT_Main.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes; ABinding: TIdSocketHandle);					

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

_________________
PROGRAMMER: A device for converting coffee into software.
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: 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:

ausblenden 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;

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 16.11.09 10:29 
Crossposts bitte markieren:
www.delphipraxis.net....html&highlight=

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 16.11.09 10:39 
Aber der Client ist verbunden, und es werden auch Daten hingeschickt? Sicher?

_________________
PROGRAMMER: A device for converting coffee into software.
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: 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):

ausblenden 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;

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.