Forum: PC-Programmierung UDP-Sockets (Xojo) - Mac/Win - unterschiedliches Verhalten


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich programmiere hier an einer Lösung, um eine LED-RGB-Matrix 192 x 96 
per UDP mit Daten zu befeuern. Dazu werden einfach "Rohdaten" mit der 
Bytefolge R-G-B-R-G-B... in der erforderlichen Menge an den Empfänger 
(Raspi) gesendet.

Während das unter MacOS mit Xojo problemlos beliebig lange funktioniert 
(ca. 1 Bild pro Sekunde), habe ich unter Windows den Effekt, dass 
zunächst nach dem Start der Applikation 3..4 Bilder übertragen werden 
und dann die Verbindung abreisst.

Lässt man das Programm weiterlaufen, erscheinen in unreglmäßigen 
Abständen von um die 10..20s immer mal wieder sporadisch einige Bilder 
auf der Anzeige.

Das fertige Projekt muss aber unter Windows laufen. Bisher hatte ich 
noch nie ernste Probleme damit, ein RealBasic- bzw. Xojo-Projekte von 
Mac auf den PC zu übertragen. Shit ...

Tips? Danke.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Welche "Verbindung"? UDP ist verbindungslos.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Rufus Τ. F. schrieb:
> Welche "Verbindung"? UDP ist verbindungslos.

Jaaaa ... krümelkack.

Du hast recht, es sollte heissen: Beim Empfänger kommt nix mehr an bzw. 
nur noch sporadisch. Achja: Firewall ist komplett aus.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Frank E. schrieb:
> Du hast recht, es sollte heissen: Beim Empfänger kommt nix mehr an bzw.
> nur noch sporadisch. Achja: Firewall ist komplett aus.

dann lies doch mal mit, ob wirklich Daten gesendet werden. Windows macht 
zwar einiges anders aber beim UDP senden werden auch wirklich Daten 
gesendet.

von Matthias (Gast)


Lesenswert?

Ist die Windows-Firewall bzw. eine vorhandene "Security-Software"
(Kaspersky, Avira, etc...) deaktiviert?

Was sagt Wireshark, was an Daten mit welchem Timing am RasPi ankommt?


@Rufus:
UDP ist schon "verbindungslos", aber "gedanklich" arbeitet man immer mit 
einer Verbindung auf der Applikationsebene (virtuelles Kabel).
Wenn keine Daten mehr ankommen, oder verhackstückt, dann geht man 
gedanklich von einem "Verbinsungsabbruch" bzw. einem "virtuellen 
Kabelbruch" aus.

Bei TCP sagt einem der Socket (theoretisch) wenn was mit der Verbindung 
nicht stimmt (z.B. keine ACKs mehr kommen). Bei UDP muss das halt die 
Applikation selber erledigen.

Laut OSI gilt auf APP-Ebene aber immer das "virtuelle Kabel".

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> UDP ist schon "verbindungslos", aber "gedanklich" arbeitet man immer mit
> einer Verbindung auf der Applikationsebene (virtuelles Kabel).

wer macht so etwas?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> dann lies doch mal mit, ob wirklich Daten gesendet werden.

Wireshark.


Frank E. schrieb:
> Dazu werden einfach "Rohdaten" mit der Bytefolge R-G-B-R-G-B... in der
> erforderlichen Menge an den Empfänger (Raspi) gesendet.

Wird wirklich für jedes einzelne Zeichen ein eigenes UDP-Paket 
versendet?

Oder sind die Pakete "in der erforderlichen Menge" vielleicht 
grenzwertig groß?

192x96x3 = 55296 ... hmm.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Rufus Τ. F. schrieb:
> Peter II schrieb:
>> dann lies doch mal mit, ob wirklich Daten gesendet werden.
>
> Wireshark.
>
> Frank E. schrieb:
>> Dazu werden einfach "Rohdaten" mit der Bytefolge R-G-B-R-G-B... in der
>> erforderlichen Menge an den Empfänger (Raspi) gesendet.
>
> Wird wirklich für jedes einzelne Zeichen ein eigenes UDP-Paket
> versendet?
>
> Oder sind die Pakete "in der erforderlichen Menge" vielleicht
> grenzwertig groß?
>
> 192x96x3 = 55296 ... hmm.

Natürlich wird nicht für jedes einzelne Zeichen eine Message gesendet, 
sondern eine Message mit der Gesamtgröße von 55296. Diese wird vom 
sendenden IP-Stack fragmentiert und am anderen Ende wieder 
zusammengesetzt. Auf Raspi-Seite gibts ja damit auch kein Problem und 
beim Senden unter MacOSX ebenfalls nicht. Nur das sch... Windows nervt 
mal wieder rum.

Allerdings kann es auch kein grundsätzliches Problem sein, denn hin und 
wieder funktioniert es ja, nur eben nicht verlässlich :-((

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Frank E. schrieb:
> Natürlich wird nicht für jedes einzelne Zeichen eine Message gesendet,
> sondern eine Message mit der Gesamtgröße von 55296.

Da ist bei UDP der Erwartungswert eher "kommt nicht an". Insbesondere 
bei WLAN können bei der Übertragung einzelne Fragmente verloren gehen - 
der Empfänger kann dann das Paket nicht mehr zusammen setzen und 
verwirft es.

Bei TCP kein Problem - wird halt nochmal gesendet - aber bei UDP sind 
die Daten dann wech. Bei Kabel-LAN würde ich mal nach den Kabeln schauen 
- ein Switch sollte die 64KB eigentlich locker puffern können, selbst 
wenn der PC Gigabit und der RPi nur 100Mbit hat.

Ansonsten gibts Wireshark oder tcpdump auch auf RPi. Damit müssten sich 
kaputte UDP Pakete erkennen lassen.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Frank E. schrieb:
> Natürlich wird nicht für jedes einzelne Zeichen eine Message gesendet,
> sondern eine Message mit der Gesamtgröße von 55296. Diese wird vom
> sendenden IP-Stack fragmentiert und am anderen Ende wieder
> zusammengesetzt.

sicher das das so funktioniert?

Wo sollen denn die Infos herkommen, das ein UDP Paket fragmentiert ist? 
Dafür gibt es gar keine Infos im Header.

UDP wird 1:1 übertragen, wenn es ein Teilnehmer nicht übertragen kann, 
dann wird es einfach entsorgt.

von Jay (Gast)


Lesenswert?

IP Fragmemntiert. Der IP-Layer liegt unter UDP (und TCP). Damit werden 
auf dem IP-Layer auch UDP-Pakete fragmentiert, nur bekommt, wenn alles 
funktioniert, der UDP-Layer davon nichts mit.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jim M. schrieb:
> Bei TCP kein Problem - wird halt nochmal gesendet

Selbst da hat sich die IP-Fragmentierung als so schlechte Idee
herausgestellt, dass man sie bei IPv6 nicht mehr im Programm hat.

Dort muss ein Router in dem Moment, da er ein Paket fragmentieren
würde, dem Absender eine ICMP-Nachricht senden in der er mitteilt,
dass das Paket verworfen worden ist.

Bei IPv4 tut man gut daran, die Paketgrößen so klein zu halten, dass
man ebenfalls keine Fragmentierung braucht.  TCP setzt daher typisch
auch die Option "don't fragment", woraufhin sich die Implementierung
danach ähnlich wie bei IPv6 benimmt und statt der Fragmentierung eine
ICMP-Nachricht schickt; der TCP-Stack passt sich daraufhin dann an.

Wenn man UDP benutzen will, sollte man sich einen ähnlichen
Mechanismus ausdenken.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Jungs, die Diskussion läuft ins Abseits. Wie ich bereits schrieb, 
funktioniert es mit dem oft so verteufelten MacOSX als Sender vollkommen 
einwandfrei. Und auch bei Windows klappt es ja hin und wieder. Also 
steht die Frage, ob fragmentiert wird oder nicht oder ob das erkannt 
wird nicht wirklich.

TCP ist auch dehalb keine Option, weil ich zwar heute nur mit einer 
LED-Anzeige herummache, es in Zukunft aber mehrere parallel sein müssen 
(Muticast).

Die Frage ist, ob es unter Windows 7 bekannte Schwächen von UDP-Sockets 
gibt, die ich nicht kenne und aber irgendwie "workarounden" muss. Danke.

von R42 (Gast)


Lesenswert?

In Zeile 42 wird die Variable "tuf" nicht inkrementiert.

von Jay (Gast)


Lesenswert?

R42 schrieb:
> In Zeile 42 wird die Variable "tuf" nicht inkrementiert.

Das, und die offensichtliche Weigerung mal mit Wireshark (an der 
richtigen Stelle) nachzusehen was los ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank E. schrieb:
> Also steht die Frage, ob fragmentiert wird oder nicht oder ob das
> erkannt wird nicht wirklich.

Doch, schon.  Es ist durchaus nicht unwahrscheinlich, dass verlustig
gegangene Fragmente die Ursache deines Problems sein könnten.  Damit
ist deine Weigerung, überhaupt über einen alternativen Ansatz
nachzudenken, durchaus hinderlich.  Muss ja nicht TCP sein, aber
einfach die Erkenntnis aus 40 Jahren IP zu ignorieren, dass man eine
Fragmentierung möglichst vermeidet (und dann entsprechend kleinere
Nachrichten sendet) zeugt nicht gerade von klugem Handeln.

Wie schon genannt, spätestens bei IPv6 (was ja nun immer mehr präsent
wird) wärst du mit deiner Methode sowieso am Ende des Lateins.

von PittyJ (Gast)


Lesenswert?

Wenn ich Probleme mit TCP habe, dann nehme ich Wireshark. Dann kann man 
auf der Quell-Maschine sehen, was abgeschickt wird, und auf der 
Zielmaschine sehen was ankommt.

Jese weitere Diskussion hier lohnt sich nicht, ohne dass wir Wireshark 
Mitschnitte haben. Denn bei UDP kann es ein Vielzahl von Problemen 
geben.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Habe das Problem zwar nicht gelöst, aber umgangen.

Ich sende die UDP-Message einfach zweimal (schönes Wortspiel).

Warum auch immer - unter Windows bringt mich das erstmal weiter, der 
Zeitplan drückt nämlich arg ...

von bluppdidupp (Gast)


Lesenswert?

Ein beliebter Fehler (auch in etlichen Tutorials) ist auf jedenfall den 
Rückgabewert von send() nicht zu prüfen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.