schnelle Netzwerkübertragung ohne Rückmeldungen
-
Hallo,
ich suche nach guten Methoden, schnell Datenpackete an einen Client zu
übertragen. Dazu darf das Programm aber nicht stehenbleiben, bis das
Datenpacket auf dem Clientrechner bestätigt wurde. Ich dachte da an
DirectPlay, da in Spielen so etwas eigentlich Gang und Gebe ist.
Wichtig ist nur, das ich ein Array als ganzes Packet an einen Rechner
schicken kann und dann der Rechner sich um die Übertragung kümmert, während
sich das nächste Array füllen kann.
Mit einer Verzögerung zum Client habe ich keine Probleme, allerdings
sollten die Packete halt genauso nacheinander eintrudeln, wie ich sie
geschickt habe.Hat jemand so etwas schon mal gemacht ? oder eine Idee mit einer
Komponente (DirectPlay?) ?Gruß
NoName
-
Nasonsten versuch doch mal UDP das ist doch auch stateless, oder spinn ich da?
-
thenoname schrieb:
ich suche nach guten Methoden, schnell Datenpackete an einen Client zu übertragen.
da ist tcp eigentlich ganz ok.
Dazu darf das Programm aber nicht stehenbleiben, bis das
Datenpacket auf dem Clientrechner bestätigt wurde.gut. tcp wartet nämlich nicht. außer natürlich,m du baust in deiner anwendungslogik ein dümmliches warten ein, zum beispiel, daß du alle happen, die du schickst, sofort bestätigt haben magst. aber das machste ja nicht. du läßt dir gar nix bestätigen. das erleigt tcp alles.
Ich dachte da an DirectPlay, da in Spielen so etwas eigentlich Gang und Gebe ist.
meinetwegen.
Wichtig ist nur, das ich ein Array als ganzes Packet an einen Rechner
schicken kann und dann der Rechner sich um die Übertragung kümmert, während
sich das nächste Array füllen kann.du machst also send(socket,...) und während dieses aufrufs kopiert der rechner nur die daten in interne datenpuffer des bestribssystems und das bestriebssystem liefert aus so schnell das netzwerk es eben schafft und so schnell der client (verzögert) bestätigt. sagen wir mal, der empfänger hat ein empfangspufferfenster von 10 pakten und der sender kann einfach so 10 pakete schicken. erst bei dem 11. paket würde er warten müssen, bis das erste bestätigt ist. so kannste normalerweise full speed schicken und der empfänger nimmt einfach an, was er kriegt und bestätigt hin und wieder mal. allerdings, wenn der empfänger zu langsam ist, wird der sender auch in seiner sendewut gebremst. das ist tcp. nimm es einfach.
Mit einer Verzögerung zum Client habe ich keine Probleme, allerdings
sollten die Packete halt genauso nacheinander eintrudeln, wie ich sie
geschickt habe.das ist tcp! nimm es einfach. tcp zerhackt dein array in handliche pakete, macht die geschwindigkeitssteuerung mit den 10 oder wievielen empfangspuffern UND sorgt noch dafür, daß die pakete beim empfänger-programm sogar in der richtigen reihenfolge ankommen. kurzum, tcp ist das, was man braucht.
wenn du zweifel an tcp hast, dann komm raus mit konkreten bedenken, weshalb du meinst, was anderes nehmen zuz müssen, und wir überlegen dann mal scharf, ob du nicht beim selbermachen dann doch genau alles ganz exakt so machen solltest, wie tcp es schon macht.
-
Jo, da hab ich hier mal so einen Copy von einem älteren Thread:
Zelby schrieb: Was ich benutze weiss ich ehrlich gesagt selber nicht. Ob es nun UDP oder TcpIp ist. Wo ist eigentlich der unterschied? udp ist einfaches pakete-versenden ohne bestätigung. recht unsicher dafür aber schnell. tcp ist aus anwendungssicht ein 'datenstrom'. das zerstückeln in pakete, flowcontrol, fehlererkennung, retransmissions usw. besorgt tcp 'im hintergrund' Zelby schrieb: Kann ich jetzt sicher sein, das Windows das alles selbst erledigt? kannste. socket 'send()' schreibt die daten in einen fifo-buffer, auf der anderen seite holt tcp sie raus und verschickt sie. brauchst dich um nichts zu kümmern (bis auf die rückgabewerte der send()/recv() funktionen)Ich frag mich jetzt halt, ob es in meinem Falle nicht mit einem UDP
Stream besser getan wäre. Ich hab halt Angst, das mein Programm bei kurzzeitigem
hohem Datenverkehr mal kurz anhält. Da wäre dann ein Rucken in der Grafik sehbar
und das will ich nicht haben.
Und da wäre auch schon meine eigentlich Frage:
Kann ich mit send() auch UDP versenden oder muss ich da DirectPlay nehmen.Wenn ich dich richtig verstanden habe, kann ich in TCP die Rückgaben ignorieren.
z.B. indem ich Windows Messages einfach nicht benutze ?
Oder ist es doch so, das ich send() ausführe, mein Array übergebe und dann
warten muss bis die Routine zurückkommt ?Gruß
thenoname
-
-
Rucken in der Grafik entsteht ist oft durch einen Packetloss Unterwegs. Pakete können auch bei einem STateless Protokoll verloren gehen, da musst Du anders ansetzen.