Einzelnen Beitrag anzeigen

Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#6

Re: wie einen stream mit den socks senden und empfangen?!

  Alt 10. Mai 2005, 13:16
Also ich schick dir mal eine komplettlösung - so wie ich es gemacht hab.
Ich bin so begeistert von diesem Forum, daß ich liebend gerne auch source codes reinposte für die ich 2-3 wochen gebraucht hab
uns so hinzubekommen wie ich es haben wollte.
Das ist teil meines Anticheats - die funktion die screenshots an den server versendet .....
Aja an die Profis hier - wenns bessere methoden gibt - ich rede gerne darüber .

Verschicken und Empfangen von streams (files) über tserver/tclient socket:
Client:
Delphi-Quellcode:
         const
               Package = 256;
          var
             JpegImg: TJpegImage;
             AStream : TFileStream;
             buffer : Pointer;
             i,last, count : integer;


               try
                 AStream := TFileStream.Create('machstdu.jpg',fmOpenRead);
                 buffer := AllocMem(AStream.Size);
                 fMain.ClientSocket.Socket.SendText('#SIZE' + InttoStr(AStream.Size));
                 sleep (500);
                 for i := 1 to AStream.Size div Package do
                 begin
                      AStream.Read(Buffer^,Package);
                      fMain.ClientSocket.Socket.SendBuf(buffer^,Package);
                      Sleep (50);
                      count := i;
                 end;
                 Sleep(50);
                 if ((count*Package) < AStream.Size)
                 then begin
                      last := AStream.Size - (count * Package);
                      AStream.Read(Buffer^,last);
                      fMain.ClientSocket.Socket.SendBuf(buffer^,last);
                      end;
               finally
                 FreeMem(buffer);
                 FreeAndNil(AStream);
                 deletefile( 'machstdu.jpg' );
                 AddLogEntry ('CLNT: ScreenShot has been taken & uploaded! ' + FormatDateTime('dd.mm.yyyy, hh:nn:ss', now));
                end;
Server:
Delphi-Quellcode:
      else if (TempCon^.Status = ST_GETSCRSIZE)
      then begin
           s := socket.ReceiveText;
           if copy(s,1,5) = '#SIZE'
           then begin
                TempCon^.Screensize := StrtoInt(copy (s,6,length(s)-5));
                TempCon^.Status := ST_GETSHOT;
                TempCon^.ScreenTimeOut := incmillisecond (Time, strtoint(edtSSTimeOut.Text));
                AddLogEntry ('Size recv - going st_getshot');
                end
                else begin
                     AddLogEntry('ERROR: In Screenshot RECV! No Size received try again');
                     AddProtocolEntry('ERROR: Screenshot faild no Size RECV!');
                     TempCon^.Status := TempCon^.OldStatus;
                end;
           end
      else if (TempCon^.Status = ST_GETSHOT)
           then begin
                len := Socket.ReceiveLength;
                try
                  str := TFileStream.Create(TempCon^.ScreenFileName ,fmOpenReadWrite);
                  str.Seek(0,soFromEnd);
                  buffer := AllocMem(len);
                  Socket.ReceiveBuf(buffer^,len);
                  str.Write(buffer^,len);
                finally
                  FreeMem(buffer);
                  if (str.Size >= TempCon^.ScreenSize)
                  then begin
                       FreeAndNil(str);
                       TempCon^.Status := TempCon^.OldStatus;
                       if cbxShowScreen.Checked then ScreenshotReady (TempCon^.ScreenFileName);
                       AddProtocolEntry ('EndOfScreenShot');
                       end
                       else FreeAndNil(str);
                end;
Das ist ein dirrekter Auszug aus meine pojekt .
Ich hab bei den userdaten - also für socket.connection[i].data 3 variablen angelegt.
1. einen status - tempcon^.status - der mir anzeigt ob ich daten oder text empfange.
2. screensize - im prinzip schicke ich vorher nur die größe der zu erwartenden datei, damit ich weiß wann schluss ist und ich den status von daten auf text zurückstellen kann.
3. screentimeout - ich hab sicherheitshalber eine timeout funktion eingebaut, kann ja sein, daß bei der übertragung was schief geht.

Das war für mich die einzig praktikable Lösung - und wie gesagt für das ganze hab ich wochen gebraucht !!!
Hoffe ich habs gut gemacht

Arnulf
  Mit Zitat antworten Zitat