![]() |
wie einen stream mit den socks senden und empfangen?!
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 |
Re: wie einen stream mit den socks senden und empfangen?!
Zitat:
Zitat:
|
Re: wie einen stream mit den socks senden und empfangen?!
Guck dir doch mal meinen Chat an:
![]() 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. |
Re: wie einen stream mit den socks senden und empfangen?!
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:
kann gut sein dass es komplett falsch ist..
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; bitte helft mir! danke,danke! |
Re: wie einen stream mit den socks senden und empfangen?!
Moin!
Zitat:
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 |
Re: wie einen stream mit den socks senden und empfangen?!
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:
Server:
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;
Delphi-Quellcode:
Das ist ein dirrekter Auszug aus meine pojekt :).
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; 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 |
Re: wie einen stream mit den socks senden und empfangen?!
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; |
Re: wie einen stream mit den socks senden und empfangen?!
genau lesen :)
buffer := AllocMem(AStream.Size); edit : oder wo bekommst die zugriffsverletzung`? server oder client - hab mir nur den client angeschaut!!! Arnulf |
Re: wie einen stream mit den socks senden und empfangen?!
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! |
Re: wie einen stream mit den socks senden und empfangen?!
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
Delphi-Quellcode:
Kannst dir vorstellen wie lang ich gesessen bin um das hinzubekommen lol .... - hätte diese forum vorher schon finden sollen :)
TempCon^.ScreenFileName
Arnulf |
Re: wie einen stream mit den socks senden und empfangen?!
Moin!
[quote="Arnulf"]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.../quote] Das muss 100%ig nicht gemacht werden - daher muss das Problem an einer anderer Stelle liegen. fmCreate reicht und danach kann man ganz normal in die Datei schreiben. @Threadersteller: Stell doch mal bitte dein komplettes Projekt als Anhang hier zur Verfügung oder schicks per PN, wenn es nicht öffentlich sein soll. Ansonsten kann ich sonst noch auf meinen Chat auf meiner HP verweisen, was ich zuvor extra nicht gemacht habe, da er umfangreicher ist und etwas komplizierter als dieses hier, aber vielleicht erkennst du daraus, ob du irgendwas grundlegend anders machst... Ansonsten ist mir beim überfliegen noch aufgefallen, das ein AllocMem() auf die gesamte Stream-Size leicht fehlschlagen kann, weil die Datei zu gross ist. Und da fallen mir gleich 2 andere Lösungsmöglichkeiten an: 1. Geht es an der Stelle um das Senden der Datei und daher könnte man auch einfach einen TMemoryStream nehmen und TMemoryStream.Memory angeben als Zeiger auf die Daten. 2. Oder einfach sich gar nicht gross drum kümmern und einfach nur die SendStream() Methode der Sockets nutzen zum senden. Dabei beachten, das der Socket den Stream freigibt wenn er fertig ist und man es daher nicht selber machen darf nach dem Aufruf (der sofort zurück kehrt, nicht erst nach dem Senden). MfG Muetze1 |
Re: wie einen stream mit den socks senden und empfangen?!
Hallo,
ich kann Dir nur dringend empfehlen im stThreadBlocking Mode zu arbeiten. Dann kannst Du mit TWinSocketStream arbeiten. Dann spaltet TServerSocket für jede Clientverbindung einen TServerClientThread ab, der dann die Verbindung zum Client hält. TServerClientThread.ClientSocket ist dann der serverseitge Endpunkt der Verbindung. In der Methode TServerClientThread.ClientExecute wird aus der Verbindung gelesen. Für eine Implementation der Methode TServerClientThread.ClientExecute gibt es in der Delphi-Hilfe sogar ein Beispiel. In meiner D5 Hilfe gibtes das auf jeden Fall. Wenn Du mit TWinSocketStream arbeitest gibt es das Problem, dass irgendeine receive Methode mehrmals aufgerufen wir nicht. |
Re: wie einen stream mit den socks senden und empfangen?!
jo - ich denke meine vorredner haben mit dem create recht - daran liegts nicht.
*tut leid hab ein bisschen wisky drin* aber ich hatte das problem tatsächlich und habs dann hin bekommen. wäre jedenfalls interessant das problem zu erkennen - ich habs nämlich nicht verstanden. ich hab damals versucht einen memory stream über den socket zu verschicken und hab immer nur 0 kb raus bekommen. als ich dann den memory stream in eine file gespeichert hab und als file stream gelanden hab, hats dann funktioniert. Also dann sind alle daten angekommen. aber mal im ernst - ich hab nicht so viel erfahrung mit den dingen. aber tatsache ist, daß das event serverClientRead öfter aufgerufen wird und nicht nur einmal. also wenn man dort drin mit fmcreat arbeitet hat das ja wohl ned so viel sinn. man muß ja wohl immer wieder in das file schreiben (mit jedem tcp packerl) und es nicht immer wieder erzeugen. also sollte man schon das file vorher erstellen und dann in dem event drauf schreiben. ich geb ja zu ich bin grad sehr besoffen, aber trotzdem find ich es nicht so blöd was ich gesagt hab. :) vielleicht bin ich ja morgen ja anderer meinung lol ... also ned bös sein :) cu! und immer brav feiern .... Arnulf |
Re: wie einen stream mit den socks senden und empfangen?!
Naja kommt mir immer noch nicht dumm vor was ich gestern geschrieben hab.
Was ich damals als ich damit herum experementier hab, hab ich am server einfach receivetext benutzt und ein textfile über den socket geschickt. in das textfile hab ich nur 01234567890123456789 usw.... reingeschreiben und mir dann angeschaut wie das ankommt. Damit kannst die kommunikation debuggen - und du weißt dann auch , daß der client grundsätzlich richtig arbeitet. Auch kannst das einfach mal in nem memo ausgeben und mußt nicht in ein file schreiben. wenn du die daten richtig rüber hast, dann ists klar, daß der client richtig sendet aber am server was nicht stimmt. Ich konnte auf die schnelle am server nämlich keine fehler entdecken. Ich verwende übrigens stNonBlocking und hatte bisher keine probleme damit. Allerdings hab ich auch ThreadCacheSize auf 0 weil das bei mir immer wieder probleme machte - vor allem wenn ein fehler in der verbindung auftrat - ich weiß sollte nicht sein, weil der cache ja nur eine kopie von dem thread hält - aber trotzdem .. Arnulf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz