Winsocket UDP struct

Liebes Forum!

Mich würde interessieren, ob eine struct, die ich von einem Client sende, auch wieder ganz beim Server ankomment.

typedef struct \_NETDATA
{
 // Around 100 bytes of data
} NETDATA;

// Client
NETDATA data;
...
sendto(socket, &data, sizeof(NETDATA), ...);

// Server
NETDATA data
recvfrom(socket, &data, sizeof(NETDATA), ...);
... // Access struct

Da ich auf Wikipedia gelesen habe, das UDP die Eigenschaften von IP übernimmt, die Pakete also fragmentiert werden können, würde mich interessieren, ob es passieren kann, das ein Zugriff auf die Elemente der Struktur nach dem Empfang auf dem Server falsche Ergebnisse erzielen könnte, falls sagen wir nur ein Teil der struct gefüllt wurde.
Weiters möchte ich gerne wissen, wie groß eine Struktur maximal sein darf, um als ganzes Stück so wie im Beispiel oben versandt und wieder empfangen werden kann.
Solle es hier Schwierigkeiten geben, wäre es auch noch toll, wenn mir jemand von euch sagen könnte, wie man das übertragen von Strukturen am besten implementieren könnte. (eventuell mit Puffern etc.) Wichtig ist mir, dass eine Struktur entweder vollständig oder gar nicht beim Server ankomment.

Bin für jede Hilfe dankbar!
mfg dixxi

Mich würde interessieren, ob eine struct, die ich von einem
Client sende, auch wieder ganz beim Server ankomment.

wieso muss es denn unbedingt UDP sein? Wenn du sicher sein willst, dass alles komplett und in der richtigen Reihenfolge ankommt, dann nimm TCP.

Bei UDP ist weder die Vollständigkeit, noch die Reihenfolge definiert.

Weiterführende Artikel:
http://de.wikipedia.org/wiki/User_Datagram_Protocol
http://de.wikipedia.org/wiki/Transmission_Control_Pr…
http://de.wikipedia.org/wiki/Maximum_Transmission_Unit

Gruss
norsemanna

wieso muss es denn unbedingt UDP sein? Wenn du sicher sein
willst, dass alles komplett und in der richtigen Reihenfolge
ankommt, dann nimm TCP.

Das mag schon stimmen, nur ist TCP für meine Anwendung nicht geeignet. Ich schreibe ein kleines Game (eine Art Mini-Counter-Strike), das sich übers Netzwerk (LAN, später vielleicht sogar Internet) spielen lässt. Dabei ist es wichtig, das die übertragenen Datenpakete so klein wie möglich sind und auch so schnell wie möglich übertragen werden (Bandbreite sparen, Latenz minimieren). Und ich denke, dass dafür UDP einfach am besten geeignet ist (CS verwendet ebenfalls UDP).

Bei UDP ist weder die Vollständigkeit, noch die Reihenfolge
definiert.

Es geht mir nur darum, dass eine kleine struct von wenigen Bytes entweder ganz ankomment, oder gar nicht. Ich habe hier schon daran gedacht im ersten Member der Struktur die Länge der Struktur abzuspeichern, doch was wäre wenn ich dafür einen int nehmen würde, und es würden nur die ersten zwei Bytes anstatt des ganzen int beim Server ankommen? Gibt es nicht irgendeine Mindestgröße für ein Paket, bei der ich mir sicher sein kann, dass sie als Ganzes übertragen wird?

Weiterführende Artikel:
http://de.wikipedia.org/wiki/User_Datagram_Protocol
http://de.wikipedia.org/wiki/Transmission_Control_Pr…
http://de.wikipedia.org/wiki/Maximum_Transmission_Unit

Habe ich bereits alle gelesen, lösen mein Problem aber nicht, da ich höchst wahrscheinlich keine Pakete größer als 100 Bytes benötigen werde und ich damit noch immer in der MTU der meisten Hardwaregeräte liege.

Howdy,

Habe ich bereits alle gelesen, lösen mein Problem aber nicht,
da ich höchst wahrscheinlich keine Pakete größer als 100 Bytes
benötigen werde und ich damit noch immer in der MTU der
meisten Hardwaregeräte liege.

und welchen Teil des Artikels über die Fragmentierung hast du nicht verstanden?

Pakete mit 100 Byte kommen entweder gar nicht an, oder ganz.
Sie koennen allerdings auch doppelt oder in falscher Reihenfolge ankommen. Deswegen empfiehlt sich das Mitfuehren einer Sequenznummer.

Gruss
norsemanna

Gut, ich glaub, ich habs verstanden.

Vielen Dank!

Ich habe jetzt eine gute Antwort auf meine Frage gefunden:

http://www.gamedev.net/community/forums/topic.asp?to…