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