AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi Delphi UDP Kommunikation Indy über Internet
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi UDP Kommunikation Indy über Internet

Ein Thema von AJ_Oldendorf · begonnen am 13. Mär 2024 · letzter Beitrag vom 15. Mär 2024
Antwort Antwort
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Delphi UDP Kommunikation Indy über Internet

  Alt 15. Mär 2024, 09:01
Moin,
ok, ihr sagt, es müsste also gehen,
Ja natürlich muss es gehen. Viele Video/Audio Streams werden via UDP übertragen. Und wir sehen Bilder und wir hören Musik .

Indy nutze ich nicht. Ich nutze Overbyte ICS. Hab's soeben damit getestet. Server erreichbar - Client hinter NAT:

Du hast leider keinen Code gepostet.
Entweder blockiert bei dir eine Firewall oder du hast zu wenig auf (Adressen.Ports) geachtet, welche du verwenden musst, wenn du nicht "nur" lokal UDP verwendest.

Ablauf:
0. Server ist unter (SA,SP) erreichbar.
1. Der Client mit Quelladresse (CA,CP) sendet die Daten mit Zieladresse (SA,SP) an seinen Router; der Client Router sendet die Daten weiter an den Server. Dabei verwendet der Router als Absenderadresse (RA,RP).
Router abhängig: RP muss nicht CP sein (!).
Der Clientrouter merkt sich (CA,CP)->(RA,RP)->(SA,SP).

2. Der Server empfängt das Paket. Serverseitig musst du (RA,RP) ermitteln. ICS im OnDataAvailable zum Beispiel so (siehe auch Beispiele ICS):
Delphi-Quellcode:
  SrcLen := SizeOf(Src);
  Len := (Sender as TWSocket).ReceiveFrom(@Buffer, SizeOf(Buffer), Src, SrcLen);
  senderaddr := StrPas(inet_ntoa(Src.sin_addr));
  senderport := IntToStr(ntohs(Src.sin_port));
3. Die Serverantwort sendest du mit Quelladresse (SA,SP) an (RA,RP). Also unbedingt SP als Quellport wählen. Wenn du nur lokal mit UDP spielst, spielt der Quellport keine Rolle.
4. Die Daten kommen beim Clientrouter an. Der Router sieht das Paket (SA,SP)->(RA,RP) und findet in seiner Tabelle die ausgehende Verbindung (CA,CP)->(RA,RP)->(SA,SP). => Der Router leitet das Paket an (CA,CP) weiter.

Wie erwähnt: Irgendwann vergisst der Router die Verbindung (CA,CP)->(RA,RP)->(SA,SP) wieder, weiss dann nicht mehr, wem er das Paket zustellen soll und lässt deshalb keine weiteren Pakete vom Server zum Client durch. Dies kannst du verhindern durch SO_KEEPALIVE oder durchs Senden von irgendwelchen Paketen.
Michael Gasser

Geändert von Michael II (15. Mär 2024 um 09:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:56 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-2025 by Thomas Breitkreuz