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.


Anmelden zum Antworten