Laden...

TCP Datei (Bild) versenden zerstört Bild

Erstellt von Merlin_S vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.380 Views
M
Merlin_S Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren
TCP Datei (Bild) versenden zerstört Bild

Liebe Community,
Ihr habt mir schon oft bei noch so bescheuerten Problemen geholfen, ich hoffe ihr könnt mir auch diesmal helfen.
Nach viel zu viel Nervengetränken (So ein komischer instant-Eistee von Lidl, scheußliches Zeugs X( ) habe ich mich entschieden, euch um Hilfe zu beten.

Folgendes Problem: Ich schreibe gerade ein Programm, welches als Server verdeckt auf meinem PC läuft, und noch eines, welches ich auf einem anderen PC starten kann und damit auf meinen PC zugreifen kann. Der Server sendet nun dem verbundenen Client die aktuellen Tastatureingaben, ausserdem kann der Client Screenshots anfordern. Als kleines schmankerl kann ich vom Client noch Messageboxen auf dem Server ausgeben lassen.
Achtung: Mir ist klar, dass es illegal ist, dieses Programm ohne die "opfer" zu fragen einzusetzen. Ich starte es jedoch nur auf meinem PC, da dieser auch von anderen ab und zu genutzt wird und ich das Gefühl habe, das man dort nicht nur die Sachen macht für die die Benutzungserlaubnis vorgesehen ist. Ich werde die Benutzer meines PCs natürlich dementsprechend vorwarnen!

Mein Problem liegt nun bei dem versenden der Screenshots. (Noch, wohlgemerkt, ich bin noch nicht bei den Tastatureingaben...) Das läuft folgendermaßen ab:1.Client fordert bild an. (SCREENSHOT) 1.Server sendet Informationen (SEND_FILE dateiname dateigröße TO_END) 1.Server stoppt die Übertragung der Tastatureingaben 1.Server schreibt den gesamten Inhalt der Datei auf einmal in den Stream (Als Byte-Array) [Könnte hier der Fehler liegen??] 1.Client liest den Stream in 128byte-Schritten aus. 1.Sobald der Client fertig ist teilt der dem Server dies mit (SCREEN_ACCEPT) 1.Der Server sendet die Bestätigung (SUCCESSFUL 1)

So, nun sollte das Bild komplett da sein, ist es gewissermaßen auch, allerdings sieht es folgendermaßen aus: (siehe Anhang)

Meiner Meinung nach sollte es also so sein, dass dort bytes hereinrutschen, die dort definitiv nicht hingehören. Aber wie kommt das?

Code-Teile kann ich natürlich liefern, auch das gesamte Projekt hochladen (Allerdings 0 dokumentation...), aber ich wüsste nicht, was genau ich im Moment zeigen könnte was helfen würde.

besten Dank im Voraus
Merlin

M
Merlin_S Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Im Anhang einmal das Gesamte Projekt.

Folgende Codestellen könnten interessant sein:
So Sende ich:


sShotProvider.CaptureScreenToFile("tmp.jpg", ImageFormat.Jpeg);
byte[] fBytes = File.ReadAllBytes("tmp.jpg");
int Size = fBytes.Length;

ThreadPaused = true;

Send("SEND_FILE tmp.jpg " + Size + " TO_END");
cSocket.Send(fBytes);
Send("");

File.Delete("tmp.jpg");

So empfange ich:

                while(Pointer < fSize)
                {
                    byte[] buffer = new byte[128];
                    
                    int readBytes = ns.Read(buffer, 0, 128);
                    f.Write(buffer, 0, readBytes);
                    Pointer += readBytes;                  
                }

                AcceptScreenShot();

                string lLine = RecieveLine();
                f.Close();
                ThreadPaused = false;
                if(lLine.Split(' ')[0] == "SUCCESSFUL")
                    if (ScreenShotRecieved != null)
                        ScreenShotRecieved(fName);
                    else
                    {
                        
                    }
                else
                {
                    throw new ScreenshotException("Übertragungsfehler.");
                }

Send macht einfach ein StreamWriter.Writeline() und ein ~.Flush(), Readline gibt einfach eine StreamReader.ReadLine() zurück.

Im Anhang das komplette Projekt.

Im Nachhinein finde ich habe ich das Senden/Empfangen relativ suboptimal gelöst. Kennt ihr bessere Lösungen?

Und kennt einer diesen scheußlichen Zitronentee von Aldi/Lidl (hab grad vergessen woher ich das zeug habe...) Der macht verdammt süchtig 😄

M
Merlin_S Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Eine weitere Information könnte sein: Das Quell(Server)bild und Ziel(Client)Bild sind von der Dateigröße her Unterschiedlich. Nun bin ich 100% Ratlos... 🙁

C
401 Beiträge seit 2007
vor 15 Jahren

Folgende Informationen wären hilfreich:

  • Liest der Server alle Bytes des Bildes ein?
  • Was macht die Methode Send()?
  • Von welchem Typ ist das Objekt f, welches du beim Empfänger zum schreiben verwendest?
R
119 Beiträge seit 2008
vor 15 Jahren

was mich interessieren würde, welches protokaoll verwendest du?
UDP oder TCP?

M
Merlin_S Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Hallo Corpsegrinder, Hallo Raptor2101,

Folgende Informationen wären hilfreich:

  • Liest der Server alle Bytes des Bildes ein?

Ja, siehe:

byte[] fBytes = File.ReadAllBytes("tmp.jpg");
  • Was macht die Methode Send()?

die macht nichts weiter als ein StreamWriter.WriteLine() und ein StreamWriter.Flush().

  • Von welchem Typ ist das Objekt f, welches du beim Empfänger zum schreiben verwendest?

Es ist ein FileStream:

FileStream f = File.Create(fName);

was mich interessieren würde, welches protokaoll verwendest du?
UDP oder TCP?

Ich benutze TCP.

Merlin

4.939 Beiträge seit 2008
vor 15 Jahren

Du mußt die Datei binär einlesen (nicht als Text), sonst werden alle Zeilenumbrüche '\n' als '\r\n' gelesen...
(dasselbe gilt natürlich auch für das Schreiben)

Wie hast du denn die Variablen 'ns' und 'f' beim Empfangen konstruiert?

P.S. habe gerade deine Signatur gelesen -)

M
Merlin_S Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Hallo Th69,

Aber das tu ich doch?

byte[] fBytes = File.ReadAllBytes("tmp.jpg");

Also ich meine hier im Forum gelesen zu haben das man non-ASCII dateien als byte-Arrays versenden muss, das mache ich hier doch?!

Merlin

1.200 Beiträge seit 2007
vor 15 Jahren

Im Firefox sieht das oben angehängte Bild aus, als wäre nur der Rotkanal angekommen, in Iron als wäre es grün.

Vergleich doch mal die beiden Dateien in nem Hexeditor. Das erste Drittel scheint ja zu stimmen. Was läuft dann schief? Welches byte müsste da eigentlich stehen?

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

S
341 Beiträge seit 2008
vor 15 Jahren

Servus,

ich kann es zwar nicht testen oder genau anschaun... aber beim ersten blick würd ich sagen du ließt trotz der while schleifen immer die byte 0 bis 128 mit dem "ns.Read(buffer, 0, 128)

aber wie gesagt, ich kann grad nicht nachschaun wie das beim Read ist.... ist nur eine Vermutung die mir spontan einfällt... vllt liegt es ja daran 😁

while(Pointer < fSize)  
                {  
                    byte[] buffer = new byte[128];  
  
                    int readBytes = ns.Read(buffer, 0, 128);  
                    f.Write(buffer, 0, readBytes);  
                    Pointer += readBytes;  
                }  

Grüße
Smou

**Nur die Kenner können mit 10 Fingern bis 1023 zählen !!**
private int Main()
{
   string programmingSkills = getMySkills("programming")
   return = 1;
}
M
Merlin_S Themenstarter:in
116 Beiträge seit 2006
vor 15 Jahren

Werden Daten einmal aus dem Netzwerkpuffer gelesen, verschwinden sie dort, das mit dem "immer ab 0 lesen" ist also richtig 🙂

R
119 Beiträge seit 2008
vor 15 Jahren

mach doch mal was ganz simples

les ein bild ein und speichere es ohne es zu versenden lokal

da du TCP nutzt ist ein verlust von bytes beim transport ausgeschlossen (deswegen fragte ich) daher würd ich wetten dass du das bild falsch versendet wird

check mal CaptureScreenToFile und ReadAllBytes...