Ich habe inzwischen einiges mehr zum Thema gelesen. Anstelle eines UDPClients verwende ich nun einen Server.
Hier meine Routinen, wie sie derzeit aussehen.
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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure TFormTriggerLoad.BttDLUDPStreamClick ( Sender : TObject ); begin if IndTCPClient.Connected = False then begin Self.IndTCPClient.Host := Self.ExtractHost( Self.EdtDLURL.Text ); Self.IndTCPClient.Port := 1755; Self.TCPInfoString := 'Host: ' + Self.IndTCPClient.Host + #10 + 'Port: ' + IntToStr( Self.IndTCPClient.Port ); Self.IndTCPClient.Connect( -1 ); if Self.IndTCPClient.Connected = True then begin Self.IndTCPClient.Disconnect( ); end else ShowMessage( 'TCP-Connection failed:' + #10#10 + Self.TCPInfoString ); end else ShowMessage( 'TCP already connected:' + #10#10 + 'Host: ' + Self.TCPInfoString ); end;
procedure TFormTriggerLoad.IndUDPServerUDPRead ( Sender : TObject; AData : TStream; ABinding : TIdSocketHandle ); var StreamTarget : TFileStream; Buffer : Array[ 0..4096 ] of Byte; BufferRead : Longint; begin StreamTarget := TFileStream.Create( Self.EdtDLPathTarget.Text, fmCreate ); repeat BufferRead := AData.Read( Buffer, SizeOf( Buffer ) ); until ( BufferRead = 0 ) or ( StreamTarget.Write( Buffer, BufferRead ) = 0 ); StreamTarget.Free( ); end; |
Quelle:
Brauche Crashcurs in UDP
(Das noch Fehlernehandlungen geschrieben werden müssen ist klar. Ich möchte aber erst einmal eine Verbindung herstellen.)
Das Prinzip des UDP habe ich jetzt soweit verstanden. Der Stream wird vom Host im Netz über einen definierten Port gesendet. Über diesen Port kann mein UDP-Server die Daten lesen. Ohne Anmeldung, etc.. Allerdings muss für das Streamen mittels MME-Protokoll dieser Port vom Host geholt werden. Wurde er empfangen, kann die TCP-Verbindung wieder geschlossen werden. Bei einem Chat-Programm vie UDP beispielsweise fällt die TCP-Verbindung komplett weg, da man sich von vornherein über einen festen Port einigen kann, welcher standardmäßig für die auszutauschenden UDP-Streams verwendet wird.
Der UDP-Server bekommt den UDP-Port aus der Anfrage des TCP-Clients an den Host zugewiesen, welchen er quasi die ganze Zeit abhört, und sobald ein Datenpaket kommt, dieses auch annimmt (onUDPRead).
Nun weiß ich nicht, wie ich eine Anfrage an den Host im Netz sende, damit er mir einen UDP-Port zurückgibt, welchen ich für den Stream nutzen kann. Ich weiß auch nicht, wie ich dem Server mitteile, welchen Stream er mir via UDP senden soll. Wie benutze ich in diesem Fall den TCPClient?
Wenn ich etwas von der Theorie bis hierher falsch verstanden habe, korrigiert mich bitte.
//Edit @
UGrohne: Deinen Hinweis zum Aushandeln des UDP Port über ein weiteres Protokoll habe ich gelesen. Aber dazu weiß ich leider nicht wie.