DC per UDP versenden
-
Ich versuche den Inhalt eines DC(800x600) zu versenden. Das ganze sollte alle 1-2 Sekunden versendet werden. Ich habe es bereits per TCP versucht und Pixel für Pixel versendet, aber das ist viel zu langsam um es im Sekundentakt zu wiederholen.
Deshalb hab ich an UDP gedacht, aber da stellt sich für mich die Frage, wie ich die Pakete aufbauen soll
. Bei UDP sollen ja sehr viele Daten beim Senden verloren gehen. In TCP habe ich einfach einen Pixel nach dem anderen gesendet und nach 800 Pixeln in der neuen Zeile weitergezeichnet, aber wenn durch UDP Daten verloren gehen rutschen die Pixel in die falsche Zeile(Ich hoffe ihr versteht was ich meine).
Wie würdet ihr das lösen?Danke schonmal für eure Vorschläge
-
oje..
Edit
Ich versuche den Inhalt eines DC(800x600) zu versenden. Das ganze sollte alle 1-2 Sekunden versendet werden. Ich habe es bereits per TCP versucht und Pixel für Pixel versendet, aber das ist viel zu langsam um es im Sekundentakt zu wiederholen.
Kann ich mir nicht vorstellen. Da machst Du was falsch.
1. Ich würde nicht pixel für pixel, sondern alles (ein Screen) auf einmal senden.
2. Ev. TCP_NODELAY setzen um den Nagle Algorithmus auszuschalten.
3. Ev. komprimieren.
4. Ev. nur Teile übertragen.Guck Dir dochmal TightVNC an.
Simon
-
1. Ich würde nicht pixel für pixel, sondern alles (ein Screen) auf einmal senden.
Wie macht man das?
4. Ev. nur Teile übertragen.
Was hab ich davon wenn ich nur Teile des Bildes übertrage?
Edit: Wie kann ich den Screen vor dem senden komprimieren
-
Indem du einen Komprimierungsalgorithmus anwendest. Sei es ein bereits existierender, angepasster, oder komplett selbst gemachter.
Ehm, du sendest nicht ein Paket pro Pixel, sondern steckst alle Pixel in ein Paket, was ist daran nicht zu verstehen?
-
Ja das alles in ein Paket gepackt werden muss ist mir klar, aber gibt es einen Befehl mit dem ich das komlette DC in einen Datenblock schieben kann um ihn dann zu versenden oder muss ich das manuell mit GetPixel machen.
Welche einfachen/schnellen/bereits vorhandenen Verfahren(am besten mit vorhandenem Code
) könntet ihr mir denn empfehlen?
-
kA nie gemacht, versuchs mal mit http://msdn.microsoft.com/en-us/library/dd144879
-
Ich bin zu dumm für diese Welt

Ich versuche jetzt schon die letzten 2 Tage den DC in das Image zu kopieren und dann die Funktion GetDIBits darauf anzuwenden, aber ich schaffs nicht bzw. ich verstehe es nicht. Für was ist der Parameter hdc bei GetDIBits? Die Daten werden doch von hbmp ausgelesen. Das nur mal als eine ungelöste Frage.
Ich bin für jede Hilfe dankbar
-
Die Funktion war geraten. Hab leider wenig Ahnung von den Techniken dieser Dinge. Schon mal google bemüht?
http://lmgtfy.com/?q=GetDIBits
http://lmgtfy.com/?q=device+context+auslesen
-
Die Idee das ganze Bild in einem Paket auf einmal zu versenden ist auch nicht so gut, weil es unterwegs je nach Übertragugsstandard in Teilpakete aufgeteilt wird. Wenn dann davon eins fehlt hast du nur noch Müll.
Versende doch einfach X < n (N = Anzahl alle Pixel) Pixel auf einmal. (Am besten mit Lauflängenkodierung. Das ist einfach genug um es wirklich selbst umzusetzen).
Dann nummerierst du alle Pakete durch.
Wenn dann eins nicht ankommt, weißt du welches es ist.
(Aus der fehlenden Nummer)Dafür kannst du dann einfach was anderes anzeigen lassen. z.B. den frablichen Mittelwert der benachbarten Pixel, oder Default Pixel (immer schwarz) oder die Pixel vom letzten Bild an der Stelle.
-
Dann nummerierst du alle Pakete durch.
Wenn dann eins nicht ankommt, weißt du welches es ist.
(Aus der fehlenden Nummer)Ja, genau. Und am Ende hast Du sowas wie TCP/IP einfach viel schlechter...
-
theta schrieb:
Dann nummerierst du alle Pakete durch.
Wenn dann eins nicht ankommt, weißt du welches es ist.
(Aus der fehlenden Nummer)Ja, genau. Und am Ende hast Du sowas wie TCP/IP einfach viel schlechter...
Richtig.
Man hat nur den Teil von TCP den man braucht.
Neu senden ist unnötig (weil dann eh verspätet).
Leider kann man bei TCP den gerade nicht benötigten Teil nicht abschalten.