Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 11:46 
Guten Tag,
ich möchte mal mein Wissen ein bisschen erweitern, dabei stellen sich mir leider immer wieder Hindernisse in den Weg...
In jedem UDP-Tutorial, in dem angefangen wird zu erklären was der unterschied zwischen TCP(/IP) und UDP(/IP)... ist :gähn:,
steht dasselbe aber nichts neues :(..
vielleicht weiß einer von euch mehr als nur 'IST SO'!

Das Problem: Ich würde gerne wissen, wie groß welche Datenpakete sind und wie sie verloren gehen können...

Also: Wenn ich 10 Byte habe, die voneinander abhängig sind und diese ganzen 10 Byte verloren gehen ist es nicht schlimm.. wenn aber teile davon (z.B: 1 Byte) davon verloren gehen hat das "böse" Konsequenzen !
Ich könnte es auch so gestalten dass ich 20 Bytes habe (selbe Information wie in den 10 Bytes) aber dann müssten immer nur 2byte Pakete ankommen.. wenn mal 2 Byte verloren gehen wäre das nicht so schlimm...

Ich weiß, ich habe viel geredet und es ist wahrscheinlich nicht sehr verständlich... aber ich weiß nicht wie ich die Frage stellen soll...
können TEILE eines Paketes "abhanden" kommen? wie groß sind Pakete, wenn sie verloren gehen, mindestens..
Wenn die Reihenfolge der Pakete anders ankommt, sind dann Bytes oder 10 byte-paare vertauscht?
Es muss doch eine feste Datenpaket GRÖßE geben, oder?

Es wird immer nur gesagt, "ein paket kann verloren gehen".. ich weiß dass viele Komponenten etwas gesendetes zerlegen (z.B. streams) und dann in einzelnen Paketen senden, sind das diese "paktete"? oder werden die z.B. vom Router nochmal eingeteilt? und wenn das die komponente macht, dann kann man das sicher umgehen.. (dazu später)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 13.08.13 12:17 
Zitat:
UDP stellt einen verbindungslosen, nicht-zuverlässigen und ungesicherten wie auch ungeschützten Übertragungsdienst bereit. Das bedeutet, es gibt keine Garantie, dass ein einmal gesendetes Paket auch ankommt, dass Pakete in der gleichen Reihenfolge ankommen, in der sie gesendet wurden, oder dass ein Paket nur einmal beim Empfänger eintrifft. Es gibt auch keine Gewähr dafür, dass die Daten unverfälscht oder unzugänglich für Dritte beim Empfänger eintreffen. Eine Anwendung, die UDP nutzt, muss daher gegenüber verlorengegangenen und unsortierten Paketen unempfindlich sein oder selbst entsprechende Korrekturmaßnahmen und ggfs. auch Sicherungsmaßnahmen vorsehen. Ein Datenschutz ist bei dieser offenen Kommunikation nicht möglich.

de.wikipedia.org/wik...er_Datagram_Protocol
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 12:53 
ok, das wusste ich auch :D
mir geht es speziell um die Pakete.. wer teilt sie ein? wie groß sind sie?
kann man sie selbst einteile`? mir ist es lieber es gehen 100 % oder 0 % als irgendwas dazuwischen verloren
können auch nur 50% eines packets verloren gehen (letzte frage ist beantwortet)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.08.13 13:11 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
wer teilt sie ein?
z.B. Router auf dem Weg

user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
wie groß sind sie?
so groß wie die Fragmentierungsgröße, die die Geräte auf dem Weg eingestellt haben

user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
kann man sie selbst einteile`?
Auf den Geräten, auf die du Zugriff hast, ja. Wenn es im Internet verschickt wird, gibt es dazwischen aber ja genug andere.

Die Pakete werden (standardmäßig, das lässt sich einstellen) verworfen, wenn entweder nicht alle fragmentierten Pakete eines Datenpakets ankommen oder ein Prüfsummenfehler auftritt. Du musst wirklich nur darauf achten, dass die Reihenfolge der Pakete nicht stimmen muss und auch welche fehlen können.

Spiele versuchen das so lange wie möglich lokal auszugleichen. Fehlen bestimmte Daten zu lange hat man das, was man als Laggs kennt. Lässt sich das lokal nicht mehr ausgleichen, wird die Verbindung als abgebrochen behandelt.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 13:35 
ok, also wenn z.B. ein Cardinal (im Stream) 4 Byte groß versendet wird.. und dann Byte 1, 3, 2, 4 ankommt, wie soll ich sowas handeln? es müssen mindestens 2 Byte zusammen ankommen, damit ich vor jedes Byte die info stecken kann, du bist Byte nr so und so...

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 13.08.13 14:23 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
ok, das wusste ich auch :D
mir geht es speziell um die Pakete.. wer teilt sie ein? wie groß sind sie?
kann man sie selbst einteile`? mir ist es lieber es gehen 100 % oder 0 % als irgendwas dazuwischen verloren
können auch nur 50% eines packets verloren gehen (letzte frage ist beantwortet)


Beispiel:
IdIcmpClient.PacketSize := 24;
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Di 13.08.13 14:53 
Ich weiß auf welches Problem du hinaus willst.. Du verwechselst UDP mit TCP
TCP baut auf eine Streaming Methode, wohingegen UDP auf Pakete basiert - sprich wenn du ein Paket abschickt kommt dieses Paket entweder GANZ (100%) an, gar nicht oder in anderer Reihenfolge.
Ein Paket ist ein Paket nicht weniger nicht mehr. Wenn du 1x 10 Bytes abschickt, 2x 50 Bytes dann kommen 1x 10 Bytes, 2x 50 Bytes and (bzw in anderer Reihenfolge)..

Bei TCP war das nicht so.

Und zu deinem vorigen Thread bzgl Multithreading - die Standardkomponenten benützen bereits Threads... hättest ins Quellcode kucken sollen..
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 15:00 
mhh..
bei TCP werden (wenn man 100 Bytes sendet 10x10 Bytes oder sonst was) gesendet.. bei UDP passiert das nicht?
wenn ich z.B. mit UDP einen 1 GB stream sende, dann sendet er ein 1 GB packet???
nach dem Beispiel von hathor kann man ja einstellen wie groß die paketgröße sein soll.. wenn ich dann
Paketgröße := Stream.Size;
SendStream( Stream );

mache, dann würde 1 Gb gesendet werden? und entweder ganz oder gar nicht ankommen?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Di 13.08.13 15:02 
Nein, die maximale Größe ist begrenzt (bei Win. ist es 64kb)
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 15:13 
ok :)
also streams und so immer in max. 64-pakete teilen, die alle einzeln gelesen / verstanden werden können?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Di 13.08.13 15:18 
Joa.. das ist standardmäßig so.. den Wert kann man verändern!
Siehe setsockopt() - vorallem diese Parameter:
SO_RCVBUF
SO_SNDBUF

Falls es sich immer noch um dein Spiel handelt, dann schlage ich vor, du bleibst bei TCP..
Du brauchst noch lange kein UDP..

Wichtig ist aber, dass du das Nagle's Algorithm abstellst.
Dafür wieder dieselbe Funktion verwenden, diesmal mit dem TCP_NODELAY Parameter!
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 15:22 
naja, allgemein mal zu UDP.. denn ich denke auch wenn mein spiel auf TCP basiert, sollte ich die Ausweichmöglichkeit UDP kennen und auch wissen wie ich dass umzuabeun hätte !

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 15:27 
setsocktopt und TCP_NODELAY sind in welcher unit?
wie kann ich das bei den "Standart"-Komponenten TClientSocket / TServerSocket "ausschalten"?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.08.13 16:05 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
ok :)
also streams und so immer in max. 64-pakete teilen, die alle einzeln gelesen / verstanden werden können?
UDP macht für solche Daten keinerlei Sinn. Bilddaten usw. sollten schon alle über TCP übertragen werden, weil das zusammenfummeln und neu anfordern von Streamteilen selbst viel länger dauert.
UDP macht Sinn für kurze Zwischenmeldungen über Positionsänderungen usw., die dann zur genaueren Darstellung dienen können bevor das ganze per TCP geschickt wird. Kommt es nicht an, hast du bis dahin ja immer noch die vorausberechneten Positionen des Clients. Und die definitiven Daten kommen dann ja noch per TCP.

Ob sich der Aufwand lohnt, ist eine andere Frage... die lässt sich allgemein nicht beantworten.
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: Di 13.08.13 17:40 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
setsocktopt und TCP_NODELAY sind in welcher unit?
wie kann ich das bei den "Standart"-Komponenten TClientSocket / TServerSocket "ausschalten"?


WinSock

Musst selber kucken, wie du das Socket Handle rausbekommst.. Weiß das nicht auswendig, einfach in den Sourcen nachsehen!
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 13.08.13 18:55 
wie kann ich in den sourcen nachsehen?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.08.13 21:20 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
wie kann ich in den sourcen nachsehen?
In Turbo Delphi kannst du einfach mit Strg + Klick auf TClientSocket klicken oder Strg + Enter auf dem Unitnamen machen, dann landest du im Quelltext dazu.
Die alte D7 Personal in deinem Profil hat keine Quelltexte dabei, aber ich vermute doch eher, dass du das viel bessere Turbo Delphi benutzt. Da das fast eine Professional ist, nur halt kostenlos, sind auch die Quelltexte dabei.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 14.08.13 00:27 
Nein :D ich werde mir mal delphi Turbo Explorer demnächst runterladen( dank deinem Post erst kennengelernt :O)
Aber noch benutze ich delphi 7 PE ( von 2002 oder so :D)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.08.13 05:03 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
Nein :D ich werde mir mal delphi Turbo Explorer demnächst runterladen( dank deinem Post erst kennengelernt :O)
Direkt verfügbar ist es nicht mehr, aber wenn du Embarcadero nett fragst, sollte dir geholfen werden:
aerodactyl.wordpress...-version-aktiv-2013/