AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi wie einen stream mit den socks senden und empfangen?!
Thema durchsuchen
Ansicht
Themen-Optionen

wie einen stream mit den socks senden und empfangen?!

Ein Thema von prinz_inzide · begonnen am 9. Mai 2005 · letzter Beitrag vom 12. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
prinz_inzide

Registriert seit: 24. Jan 2005
64 Beiträge
 
#1

wie einen stream mit den socks senden und empfangen?!

  Alt 9. Mai 2005, 15:23
hi alle!

ich weiß den thread hats schon oft gegeben aber ich will keine "komplizierten" sachen machen sondern einfach nur nen stream vom tclientsocket an tserversocket schicken. hab delphi7.
weil schon viele sachen probiert hab un nie was geklappt hab würd ich eucht bitte mir einzelne code-snippes zu schreiben(os ja net viel oder?) weil ich inzwischen an meinem code so viel verändert hab, dass warscheinlich kein bissel mehr davon sinn macht^^
also ich bräucht n kleines bsp wie man ihn (den stream^^) sendet und eins zum empfangen..aber bitte SO EINFACH WIE MÖGLICH!

vielen(!) dank jungs!

tim
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 9. Mai 2005, 15:28
Zitat von prinz_inzide:
ich weiß den thread hats schon oft gegeben aber ich will keine "komplizierten" sachen machen sondern einfach nur nen stream vom tclientsocket an tserversocket schicken. hab delphi7.
Was du nicht gkleich verstehst, muss nicht gleich kompliziert sein. Setzt dich mit den Lösungen aus dem Forum auseinander und du hast, was du brauchst.

Zitat:
[..] würd ich eucht bitte mir einzelne code-snippes zu schreiben(os ja net viel oder?)
[..]
also ich bräucht n kleines bsp wie man ihn (den stream^^) sendet und eins zum empfangen..aber bitte SO EINFACH WIE MÖGLICH!
Gibt es hier im Forum wohl genug.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

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

  Alt 9. Mai 2005, 16:40
Guck dir doch mal meinen Chat an:

Open Source Chat

da wird beim Senden von Dateien über die Sockets ein Stream verschickt.
Ist zwar nicht ganz einfach, aber ich bin sicher, dass du's verstehen wirst.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
prinz_inzide

Registriert seit: 24. Jan 2005
64 Beiträge
 
#4

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

  Alt 9. Mai 2005, 20:09
hallo!
danke für eure antworten!
den chat guck ich mir gleich an, eben gins mal nicht (download wollte net starte..)
ich hab jetzt folgendes, was leider nicht funktioniert:
Delphi-Quellcode:
var
  sstream,rstream:tfilestream;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  sstream:=tfilestream.Create('c:\stats.jpg',fmopenread);
  client.Socket.SendStream(sstream);
end;

procedure TForm1.serverClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  rstream:=tfilestream.Create('stats1.jpg',fmcreate);
  socket.receivebuf(rstream,socket.ReceiveLength);
  rstream.Free;
end;
kann gut sein dass es komplett falsch ist..
bitte helft mir!

danke,danke!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

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

  Alt 10. Mai 2005, 00:22
Moin!

Zitat von prinz_inzide:
Delphi-Quellcode:
...
procedure TForm1.serverClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  rstream:=tfilestream.Create('stats1.jpg',fmcreate);
  socket.receivebuf(rstream,socket.ReceiveLength);
  rstream.Free;
end;
1. Beachte unbedingt, dass das ClientRead Ereignis mehrfach aufgerufen werden kann/wird, bevor alles empfangen wurde. Für jeden empfangenen Happen deiner Datei wird dieses Event ausgelöst!

2. rstream ist eine Instanz und kein Buffer. Du brauchst einen Buffer den du ReceiveBuf() übergeben kannst, damit er darin einen Teil der empfangenen Daten (oder alle - abhängig von ReceiveLength und der Grösse deines Buffers) ablegen kann. Danach kannst du diesen Teil in den FileStream schreiben (WriteBuffer()). So wie jetzt überschreibst du gnadenlos den Speicher ohne das in dem Bereich zu dürfen.

MfG
Muetze1
  Mit Zitat antworten Zitat
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, 12: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
prinz_inzide

Registriert seit: 24. Jan 2005
64 Beiträge
 
#7

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

  Alt 10. Mai 2005, 15:30
wow danke!!

das hab ich jetzt. beim klick auf button1 gekomm ich ne zugriffsverletzung..
ist das weil onclientread mehrmals aufgerufen wird?
dachte das passiert nur bei großen dateien und wollts dewegen der einfachheit halber mal so lassen um überhaupt mal ne datei (300kb) zu verschicken.
leider gehts net..

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  buffer:pointer;
begin
  sstream:=tfilestream.Create('c:\stats.jpg',fmopenread);
  sstream.Read(buffer^,sstream.Size);
  client.Socket.SendBuf(buffer^,sstream.Size);
  FreeMem(buffer);
  FreeAndNil(sstream);
end;

procedure TForm1.serverClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  buffer:pointer;
  len:integer;
begin
len := Socket.ReceiveLength;
rstream:=tfilestream.Create('c:\stats1.jpg',fmcreate);
rstream.Seek(0,soFromEnd);
buffer := AllocMem(len);
socket.receivebuf(buffer^,len);
rstream.Write(buffer^,len);
FreeMem(buffer);
freeandnil(rstream);
end;
  Mit Zitat antworten Zitat
Arnulf

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

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

  Alt 10. Mai 2005, 15:43
genau lesen
buffer := AllocMem(AStream.Size);

edit :
oder wo bekommst die zugriffsverletzung`?
server oder client - hab mir nur den client angeschaut!!!

Arnulf
  Mit Zitat antworten Zitat
prinz_inzide

Registriert seit: 24. Jan 2005
64 Beiträge
 
#9

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

  Alt 10. Mai 2005, 16:18
oopps^^
has mal dazu geschriebn (in den client) und bekomm jetzt weder einen fehler noch eine zugriffsverletzung oder sonst was..aber die datei wird auch net erstellt..

mensch ,SO schwer kann das doch net sein
ich kriegs einfach net gepeilt..

danke schon ma jungs!
  Mit Zitat antworten Zitat
Arnulf

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

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

  Alt 11. Mai 2005, 13:54
Ja ich glaub ich kann mich erinnern, das Problem hatte ich auch. Damit hab ich auch lange gespielt.

Was ich mich erinnere mußt du das file vorher erstellen bevor du etwas reinschreibst.
Also fmcreate - dann den stream wieder freigeben.
dann hast ein file mit 0kb.

danach mit fmopenreadwrite oder so öffnen und reinschreiben - dann gehts...

Wenns immer noch ned geht schau ich mir deine server source hald mal genau an

aber soweit ich mich erninnere war das der grund warum ich mir den filename in die userdaten gespeichert hab
TempCon^.ScreenFileName Kannst dir vorstellen wie lang ich gesessen bin um das hinzubekommen lol .... - hätte diese forum vorher schon finden sollen

Arnulf
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz