![]() |
ServerSocket1ClientRead
moin moin!
mein kleines serverprogramm kann mit dieser procedure binärdaten empfangen:
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket); var SizeOfPacket: Integer; pBuffer: Pointer; begin SizeOfPacket := Socket.ReceiveLength; GetMem(pBuffer, SizeOfPacket); Socket.ReceiveBuf(pBuffer^, SizeOfPacket); MUpdateStream.Write(pBuffer^, SizeOfPacket); FreeMem(pBuffer); if () then begin MUpdateStream.SaveToFile('update2.exe'); Log.Lines.Add('('+TimeToStr(Now)+') System: Ein Server-Update wurde erfolgreich empfangen und wird nun installiert.'); MUpdateStream.Free; MUpdateStream := TMemoryStream.Create; end; end; allerdings hab ich damit ein kleines problemchen. die ClientRead procedure wird ja quasi wie eine schleife immer wieder so lange aufgerufen, bis keine daten mehr empfangen werden. die empfangenen daten werden dann immer an meim MUpdateStream angehängt. am ende möchte ich dann aus dem stream eine datei erstellen. Nur ich weiss leider nicht, wie ich meine bedingung formulieren muss, dass dieser teil quasi nur nach dem letzten empfangenen paket aufgerufen wird. man könnte von seiten des clients vorher die dateigröße übermitteln, nur dafür müsste ich insgesamt mein programm zu sehr umbauen. hat jemand noch eine andere idee ? danke! yildi |
Re: ServerSocket1ClientRead
Die Datengröße ist leider erforderlich ... Du könntest vor dem Senden der Binärdaten mit SendText einfach z.B. "Data:27526" (länge in Byte) an den Server senden.
Florian |
Re: ServerSocket1ClientRead
Da dies schon eine Art Protokoll darstellt (was du hier brauchst) würde ich trotzdem diesen Weg nicht im Detail empfehlen. Er überträgt Binärdaten, warum sollte er also eine Mischung aus Text und Binärdaten machen? Vor allem: Wie weiss er, dass es noch eine Ziffer der Byteangabe ist oder schon das erste Zeichen des Binärstreams?
Empfehlung: Sende vor den Binärdaten einen INT64 direkt über den Stream, welche die Länge der nachfolgenden Binärdaten angibt. Dann hast du auf der Empfangsseite eine einfache Möglichkeit den kompletten Empfang zu ermitteln (Stream.Size und vorher gesendete Zahl). Und beachte, dass der letzte empfangene Block grösser sein kann, als der Vollendung des Streams nötige. |
Re: ServerSocket1ClientRead
Er kann prüfen, ob die ersten Zeichen DATA sind, dann weiß er, dass es sich um die Längenangabe handelt.
Ansonsten kannst du dir mal meinen OpenSource Chat angucken: ![]() Florian |
Re: ServerSocket1ClientRead
hmm danke für eure hilfe..
nur wie erkenn ich denn, wann die größenangabe nach DATA: zu ende ist ? |
Re: ServerSocket1ClientRead
Zitat:
@yildi: Schick vor dem Stream einfach dessen Grösse mit:
Delphi-Quellcode:
Beim Empfänger:
Var
lSize: Int64; Begin lSize := Stream.Size; // Grösse der zu sendenen Datei Socket.SendBuf(lSize, SizeOf(lSize)); // Grösse vorneweg schicken Socket.SendStream(Stream); End;
Delphi-Quellcode:
ein kleiner Pseudocode um dies zu verdeutlichen...
fSize : Int64; // als Klassenmitglied deklarieren
fReceiveStream: TStream; // dito ... Procedure SocketEmpfangen(...) Var lBuff: Pointer; lSize: Int64; Begin If Not Assigned(fReceiveStream) And ( Socket.ReceiveLength >= SizeOf(Int64) ) Then Begin Socket.ReceiveBuf(fSize, SizeOf(fSize)); fReceiveStream := {TMemoryStream}TFileStream.Create(...); End Else If Assigned(fReceiveStream) Then Begin lSize := Min(fSize - fReceiveStream.Size, Socket.ReceiveLength); lBuff := GetMem(lSize); Try Socket.ReceiveBuf(lBuff^, lSize); fReceiveStream.WriteBuffer(lBuff^, lSize); Finally FreeMem(lBuff); End; If ( fReceiveStream.Size = fSize ) Then Begin FreeAndNil(fReceiveStream); fSize := 0; End; End; End; |
Re: ServerSocket1ClientRead
Zitat:
|
Re: ServerSocket1ClientRead
Zitat:
Das wolltest du bestimmt nicht hören, aber es sind viele Faktoren die gegen eine sichere Funktionsweise des Chats sprechen. |
Re: ServerSocket1ClientRead
Nagut, du hast mich überzeugt :wink: Wobei ich zu meiner Verteidigung erwähnen muss, dass dies eine meiner ersten Spielereien mit den Sockets war ...
Florian |
Re: ServerSocket1ClientRead
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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