Binäre übertragung mit Streams ??
-
Hi ...
wie ich mit Streams über Sockets Datenübertragen kann weiss ich inzwischen ...
aber wie kann ich das ganze binär machen ???
Irgendjemand ne idee?? Hab dazu nichts gefunden ...
-
Ok .. der Fehler liegt bei den Sockets ...
zum Übertragen hab ich die Client und ServerSockets der Internet Komponenten benutzt. Gesendet als Stream ... Lese ich nur einen Stream ein und Speicher diesen wieder funktioniert eine *.exe beispielsweise komplett ... aber sende ich diese über die Sockets ... lässt sich die exe nicht mehr ausführen.
-
*amkopfkratz* streams sind doch binär?
-junix
-
Sidn die Dateigrössen identisch?
-junix
-
void __fastcall TForm1::Button1Click(TObject *Sender) { dlgOpen -> Execute(); dlgSave -> Execute(); Data = new TMemoryStream(); Data -> LoadFromFile(dlgOpen -> FileName); //Data -> SaveToFile(dlgSave -> FileName); //ShowMessage("complete"); Client -> Host = "127.0.0.1"; Client -> Port = 2626; Server -> Port = 2626; Server -> Open(); Client -> Open(); anzbyte = Data -> Size; Data -> Position = 0; Client -> Socket -> SendStream(Data); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerClientRead(TObject *Sender, TCustomWinSocket *Socket) { Write = new TMemoryStream(); int test = Socket -> ReceiveLength(); ShowMessage("anzbyte: " + AnsiString(anzbyte) + "test: " + AnsiString(test)); Byte *Buffer = new Byte[anzbyte]; Socket -> ReceiveBuf(Buffer, anzbyte); Write -> Position = 0; Write -> Write(Buffer, anzbyte); test = Write -> Size; ShowMessage(AnsiString(anzbyte) + " : " + AnsiString(test)); Write -> Position = 0; Write -> SaveToFile(dlgSave -> FileName); }
Ich weiss das sieht nen bissel durcheinander aus .. is aber nur zum testen ... die größe ist genau gleich ... die anzahl an bytes die ich lese vom empfangenden Socket habe ic in einer globalen variable anzbyte übergeben und stimmt daher ... es findet sonst keine andere Kommunikation statt ... trotzdem liefert Socket -> RecieveLength() einen falschen wert ... die Datei die ich letzendlich damit kopiert habe ist aber von der Bytegröße her identisch. Nur funktionieren tut sie halt net
irgendne Idee ???
-
666Blade666 schrieb:
trotzdem liefert Socket -> RecieveLength()
Was ist ein "falscher" Wert?
-junix
-
Eigentlich sollte die Methode die anzahl der bytes zurückgeben die auf dem Socket sind ... aber der Wert ist zu klein ... entspricht also nicht der größe der gesendeten datei. Empfang ich allerdings die Datei, ist die Dateigröße identisch ... kann aber eventuell auch daran liegen das nicht alles übertragen wird... und der rest mit müll vollgeschrieben wird .. oder ?
-
666Blade666 schrieb:
Eigentlich sollte die Methode die anzahl der bytes zurückgeben die auf dem Socket sind ... aber der Wert ist zu klein ... entspricht also nicht der größe der gesendeten datei.
Logisch... bei der Übertragung kommt die Datei nicht als 1 Block an sondern als einzelne Teilchen wie ich das in dem Thread den ich dir hier rausgesucht hatte ja beschrieben habe. Der Wert ist nicht zu klein sondern entspricht exakt der Anzahl Bytes welche der Socket im Puffer hat.
-junix
[edit]Lies dir den Thread den ich dir rausgesucht hatte nochmals durch. J0 hatte ganz ein ähnliches Verständnisproblem.[/edit]
-
Hi,
junix schrieb:
Der Wert ist nicht zu klein sondern entspricht exakt der Anzahl Bytes welche der Socket im Puffer hat.
in der Hilfe zu ReceiveLength() steht u.a.:
CB-Hilfe schrieb:
Note: ReceiveLength is not guaranteed to be accurate for streaming socket connections.
Und tatsächlich entspricht der Rückgabewert i.allg. nicht dem Wert der tatsächlich gelesenen Bytes. Also darf man immer nur die Anzahl der tatsächlich gelesenen Bytes in den stream schreiben, sonst landet Müll in der Zieldatei.
void __fastcall TForm2::ServerClientRead(TObject *Sender, TCustomWinSocket *Socket) { int bytesReceived(0); do { bytesReceived = Socket->ReceiveBuf(Buffer, BufferSize); Write->Write(Buffer, bytesReceived); } while (bytesReceived != -1); }
"Buffer" ist ein statischer Puffer mit einer beliebigen Größe (bei mir 8192).
btw: Ich mache gerade meine ersten Versuche in Sachen Socket-Programmierung und finde es äußerst befremdlich, daß die Funktion SendStream den Stream vernichtet. Dafür gibt es doch nicht wirklich einen einleuchtenden Grund - oder?