Avatar billede mbm2016 Nybegynder
09. juli 2010 - 01:34 Der er 13 kommentarer og
1 løsning

C# - Sende screenshots over TCP

Hej eksperter,

Jeg har lavet to programmer. Et program som hedder DeskSender, hvis funktion er at lytte efter klienter, og når en klient så er forbundet skal den sende skærmbilleder til klienten.

Det andet program er klient programmet DeskReciever, hvis funktioner er at forbinde til serveren og derefter modtage billederne.

Koden til begge programmer er tilgængelig med farve her:
http://www.magnusbm.dk/DeskSender.html
http://www.magnusbm.dk/DeskReciever.html

Det virker fint med at få sent billederne over til klienten, som i dette tilfælde jo er mig selv(127.0.0.1:51328), men problemet er, at tit bliver hele billedet enten ikke modtaget eller sendt.

Det er som om den kun modtager toppen af billedet og resten af billedet bliver så bare malet gråt?

Det er ligesom om det flimrer hele tiden, jeg har tjekket om det skulle være Graphics draw metoden (i DeskReciever), der lavede kuk i det hele, og prøvede derfor at slå double buffering til, men med intet held.

Her er et billede af hvordan det ser ud når den flimrer og dermed ikke modtager hele billedet:
http://magnusbm.dk/Flimren.jpg

Jeg kører Windows Vista Home Premium, servicepack 2

PÅ forhånd tusinde tak for hjælpen
Magnus
Avatar billede arne_v Ekspert
09. juli 2010 - 01:39 #1
Den receive kode ser gal ud!

Sockets er streams og der er ikke nogen direkte correlation mellem Send og Receive.

Hvis du laver 3 Send af 7, 5 og 6 bytes, så kan du godt lave 2 Receive af 9 bytes.
Avatar billede arne_v Ekspert
09. juli 2010 - 01:41 #2
byte[] buffer = new byte[32];
Client.Receive(buffer);
int len = 0;
int.TryParse(Encoding.Default.GetString(buffer),out len);

er gal fordi du hverken ved at du har læst alle bytes fra længden elle rom du har læst nogle data bytes.

Mit forslag: send bytes som binær og læs ind i en buffer med 4 bytes og læs indtil du har de 4 bytes.
Avatar billede arne_v Ekspert
09. juli 2010 - 01:42 #3
byte[] bufferimg = new byte[len];
Client.Receive(bufferimg, 0, len, SocketFlags.None);

Selvom len har den rigtige værdi og client faktisk sender alle data, så kan Receive godt returnere efter kun at have læst en del af dem.

Det er formentligt det som driller dig.

Når man bruger Receive, så skal man altid have en while løkke !
Avatar billede arne_v Ekspert
09. juli 2010 - 01:43 #4
En kode snippet fra lageret:

            byte[] tmp = new byte[4];
            int ix;

            ix = 0;
            while((ix += sock.Receive(tmp, ix, tmp.Length - ix, SocketFlags.None)) < 4);
            int len = BitConverter.ToInt32(tmp, 0);
            byte[] buf = new byte[len];
            ix = 0;
            while((ix += sock.Receive(buf, ix, buf.Length - ix, SocketFlags.None)) < len);
Avatar billede mbm2016 Nybegynder
09. juli 2010 - 02:27 #5
Hej Arne,

Tak for dit hurtige svar,

Jeg har nu bakset noget kode sammen, som stemmer overens med din forklaring med at recieve altid skal foregå i en løkke. De opdaterede koder finder du her:
http://www.magnusbm.dk/DeskSender.html
http://www.magnusbm.dk/DeskReciever.html


Dog render jeg ind i et nyt problem,
Paramateren er ugyldig "  ved System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)\r\n  ved DeskReciever.Form1.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) ved System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)"


Den modtager nogle gange et billede inden den smider denne undtagelse, andre gange når den slet ikke at modtage det første?

På forhånd tak
Avatar billede arne_v Ekspert
09. juli 2010 - 02:43 #6
Prøv og lad receive gemme data til en fil både i sender og receiver og se om filerne er ens.

ikke ens => stadig et problem emd overførsel

ens => problem andet sted
Avatar billede arne_v Ekspert
09. juli 2010 - 04:11 #7
Prøv og gemme data til en fil både i sender og receiver og se om filerne er ens.
Avatar billede mbm2016 Nybegynder
09. juli 2010 - 11:49 #8
Hej Arne,

Jeg har lige fundet ud af at filerne ikke er ens, dvs. som du siger et overførselsproblem.

http://www.magnusbm.dk/sender.txt
http://www.magnusbm.dk/reciever.txt

Hvad kan jeg gøre?

På forhånd tak
Avatar billede mbm2016 Nybegynder
09. juli 2010 - 11:55 #9
Avatar billede ksoren Nybegynder
09. juli 2010 - 12:09 #10
En fejl jeg umiddelbart falder over: Hvis du kigger på din while, så sender du fra starten af dit array/img for hvert gennemløb. Du skal nok sende fra position ix
Avatar billede mbm2016 Nybegynder
09. juli 2010 - 12:28 #11
Nu har jeg opdateret koderne så den følger med, med offset argumentet som ksoren pointerede, og det virker også fint på LAN, hvor jeg tester det.

Men hensigten er at det virker over WAN altså internettet. Jeg prøvede så at portforwarde på min vens computer og køre DeskSender.

Så gik jeg på min egen computer og fik DeskReciever til at forbinde til DeskSender på min vens eksterne ip. DeskSender modtog godt nok forespørgslen fra mig, men så sker der en undtagelse hos min ven i DeskSender: Klienten mangler en nødvendig rettighed

Jeg har prøvet at køre programmet både hos min ven og hos mig selv med administrator rettigheder, men uden held.

På forhånd tak for hjælpen
Avatar billede Syska Mester
09. juli 2010 - 13:06 #12
Dvs der kommer ingen fejl/exception eller noget? kode beskrivelse som måske kan hjælpe os ...

Er der ikke noget information du mangler her ? Overstående giver kun grund til gætterier for mig ...
Avatar billede mbm2016 Nybegynder
09. juli 2010 - 15:58 #13
Det virker vidst nu! :D

NU er jeg bare rendt ind i et meget meget irreterende problem jeg altid render ind i når jeg bruger TCPClient og Listener, og det er hastigheden. Det er jo skide langsomt!

26 sekunder tager det at sende et skærmbillede over internettet, fra en computer, der er blevet port forwardet.

Så prøvede jeg at bruge mit andet program som gør nøjagtigt det samme bare med C# Remoting. Og det klare den samme opgave på 3 sek.

Jeg forstår det simpelthen ikke, hvorfor skulle Remoting som sender ekstra headers og sådan noget være hurtigere end den kode jeg lige har skrevet?

På forhånd tak
Avatar billede mbm2016 Nybegynder
12. januar 2011 - 13:05 #14
lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester