Entwickler-Ecke
Internet / Netzwerk - Datei wird nicht richtig emfangen
-->Masterkill<-- - Sa 19.08.06 14:17
Titel: Datei wird nicht richtig emfangen
Hallo ich habe einen art "Screenshotmaker" programmiert und will die Datei nun über Stream verschicken, doch kann ich irgendwie nur Dateien bis zu (genau) 4096 Byte verschicken.
Hier der relevante Code:
Server:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Screencapture(bmp); bmp.SaveToFile('C:\temp\screenshot.bmp'); bmp.Free; Socket.SendStream(TFileStream.Create('C:\temp\screenshot.bmp', fmOpenRead or fmShareDenyWrite)); DeleteFile('C:\temp\screenshot.bmp'); |
Client:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var FStream: TFileStream; SizeOfFile: Integer; pBuffer: Pointer;
begin
FStream := TFileStream.Create('C:\datei2.bmp', fmOpenWrite); SizeOfFile := Socket.ReceiveLength; GetMem(pBuffer, SizeOfFile); try Socket.ReceiveBuf(pBuffer^, SizeOfFile); FStream.Write(pBuffer^, SizeOfFile); finally FreeMem(pBuffer); FStream.Free; end; end; |
Ich hoffe ihr könnt mir sagen wo ich den Fehler gemacht hab
MFG Masterkill
Moderiert von
Gausi: Delphi-Tags hinzugefügt
Born-to-Frag - Sa 19.08.06 15:04
Weil du immer nur max. 8KB empfängst wenn die Prozedur OnClientRead aufgeruen wird.. also brauchst du ein
Protokoll [
http://www.delphi-library.de/viewtopic.php?t=54269] ;) Erst Dateigröße mitteilen, dann Datei empfangen und sobald alles rüber ist -> Stream freigeben
Aber
Narses wird dir das bestimmt gleich noch ausführlich erklären :mrgreen:
-->Masterkill<-- - Sa 19.08.06 17:43
OK danke werd ihn mal fragen.
MFG Masterkill
Narses - So 20.08.06 00:40
Moin und :welcome: im Forum!
Vorab:
Bitte verwende die Delphi-Tags für den Code im Editor, dann wird der Code durch Syntaxhighliting viel besser lesbar. Du kannst das in einem Beitrag auch nachträglich noch ändern, einfach auf den Edit-Button oben rechts im Beitrag klicken:
Jetzt zu deinem Problem:
Delphi-Quelltext
1:
| Socket.SendStream(TFileStream.Create('C:\temp\screenshot.bmp', fmOpenRead or fmShareDenyWrite)); |
Damit ist unklar, wie groß der Stream ist, also wieviele Bytes jetzt folgen.
Dieses Ereignis tritt ein, wenn Daten eintreffen:
Delphi-Quelltext
1:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); |
Das heißt aber nicht, dass
alle Daten eingetroffen sind! :shock:
Wie
Born-to-Frag schon ganz richtig erkannt hat, erhälst du mit dieser Funktion lediglich die Anzahl der Bytes, die aktuell eingetroffen sind, und da der WSA-Buffer nur 8kb groß ist, sind das eben nur max. 8kb!
Delphi-Quelltext
1:
| SizeOfFile := Socket.ReceiveLength; |
Fazit: Du mußt die Größe des Streams übertragen und dann soviele Bytes lesen, was aber über mehrere OnClientRead-Ereignisse der Fall sein wird.
Das Problem ist am besten mit einem Protokoll zu lösen,
hier ist ein Beispiel [
http://www.delphi-library.de/topic_ProtokollChatTutorial+TServerSocketTClientSocket+v300_54269.html], wie man sowas machen könnte.
cu
Narses
-->Masterkill<-- - So 20.08.06 11:03
Ok danke erstmal!
Das heißt also jetzt ich soll mir das Tutorial durchlesen und dann ein eigenes Protokoll entwerfen.
/* Kurz gefragt gibt es keine Möglichkeit das mit Records zu machen? */
mfg Masterkill
//Edit
Habe grade das Tutorial gelesen, warum man keine Records benutzen soll^^
Also wenn es sont keine Lösung außer des Protokolles gibt werd ich das Tutorial durcharbeiten...
Bin aber für andere Lösungsvorschläge offen.
Mfg Masterkill
-->Masterkill<-- - So 20.08.06 11:14
Oh lol ok mein Edit kam zu spät
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!