Entwickler-Ecke
Internet / Netzwerk - datei-Empfangen bringt probleme
cesupa - Mi 22.02.06 16:54
Titel: datei-Empfangen bringt probleme
Hallo,
ich bin ziemlicher newbie in Delphi, kenn mich aber mit C++ und Visual basic recht gut aus und konnt mich in Delphi schnell zurechtfinden. ich hab jetzt jedoch ein problem mit einem Prog, mit dem man Dateien versenden kann, wenn ich versuche eine Datei zu empfangen, dann gibt er mir Interne Fehler aus und zeigt mir haufenweise Assembler-Anweisungen, von denen ich überhaupt nichts verstehe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TForm1.client_read(Sender: TObject; Socket: TCustomWinSocket); var i,empf,w,prozent:integer; dat2:file of byte; begin
datalen1:=strtoint(Socket.receivetext); setlength(databuf1,1024); memo1.Lines.add('Erwarte ' + inttostr(datalen1) + 'bytes große Datei' );
sd1.execute; assignfile(dat2,sd1.filename); rewrite(dat2);
empf:=0;
repeat Socket.ReceiveBuf(databuf1,i); blockwrite(dat2,databuf1,i,w);
until(i<=0);
closefile(dat2); memo1.Lines.add('Datei empfangen!'); end; |
So, das ist die Funktion mit der ich die Daten empfange, mir fällt aber nichts auf, was ich falsch gemacht habe, hoffe ihr habt da einen besseren Blick als ich.
Gruß
cesupa
Moderiert von
raziel: Delphi-Tags hinzugefügt
digi_c - Mi 22.02.06 17:24
Bitte bitte bitte den Code formatieren ;)
Also das CPU Fenster, kommt wenn ein schwerer Fehler auftritt, wie das kleine Fenster bei normalen WIN Anwendungen. Es ist also schwer was in die Hose gegangen :)
Wird denn die Dateigröße korrekt empfangen?
cesupa - Mi 22.02.06 17:44
Ja, also die Datei-Größe wird korrekt empfangen, damit gibts keine probleme.
Tastaro - Mi 22.02.06 17:50
Das Problem könnte dein dynamisches Array sein.
Dynamische Array haben nämlich eine Besonderheit, die viele Funktionen so gar nicht mögen:
Bei dynamischen arrays ist nicht garantiert, dass die Daten in einem fortlaufenden Speicherbereich liegen.
Verwende ein statisches array, bei dem das sichergestellt ist.
Also:
databuf1: array[0..1023] of byte;
Beste Grüße
Tastaro
cesupa - Mi 22.02.06 17:58
Hat leider auch nix gebracht.
Tastaro - Mi 22.02.06 18:08
Aus der Delphi-Online-Hilfe:
| Zitat: |
Die Methode ReceiveBuf liest bis zu Count Bytes aus der Socket-Verbindung in den Parameter Buf.
Delphi-Syntax:
function ReceiveBuf(var Buf; Count: Integer): Integer;
C++ Syntax:
int __fastcall ReceiveBuf(void *Buf, int Count);
Beschreibung
Verwenden Sie ReceiveBuf zum Lesen aus der Socket-Verbindung in der Ereignisbehandlungsroutine für OnSocketEvent eines Windows-Socket-Objekts oder in der Ereignisbehandlungsroutine für OnRead bzw. OnClientRead einer Socket-Komponente. ReceiveBuf gibt die Anzahl der tatsächlich gelesenen Bytes zurück. Wenn keine Bytes gelesen wurden, liefert ReceiveBuf -1. |
Sprich: Dein i ist nicht so richtig initialisiert.
Beste Grüße
Tastaro
cesupa - Mi 22.02.06 18:14
Okay, ich hab das jetzt so hier umgeändert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| repeat i:=Socket.ReceiveBuf(databuf1,1024);
blockwrite(dat2,databuf1,i,w); until(i<=0); |
Es kommen aber noch immer die gleichen Fehler.
Moderiert von
raziel: Delphi-Tags hinzugefügt
Tastaro - Mi 22.02.06 18:19
Probier mal noch das:
rewrite(dat2, 1);
An welcher Stelle genau steigt er denn aus? Sollte durch debuggen feststellbar sein.
Beste Grüße
Tastaro
cesupa - Mi 22.02.06 18:25
Also, ich bemerk grad im Debug-Modus, in dem Array Databuf1 sind nur Nullen enthalten. Ich glaub mal hier steigt er dann auch aus.
cesupa - Mi 22.02.06 20:23
Okay, ich hab den fehler jetzt erkannt, das Problem war, dass ich während des Sendevorgangs nachfrage, wo denn die Datei überhaupt hingespeichert werden soll, somit sendet der Client die Daten obwohl sie noch gar nicht empfangen werden, die Folge ist natürlich das der Server dann wenn er die Empfangsroutine startet, einen leeren Speicher vorfindet. Nun habe ich aber ein erneutes problem, wenn ich mit dem Senden beginne meldet mir der Debugger:
"... ist eine Exception der Klasse EConvertError mit der meldung *undefinierbare zeichenkette*."
Die undefinierbare zeichenkette sieht mir aus, als wäre sie ein teil der Datei, die gesendet wird. Wisst ihr auch dabei rat ?
Danke für eure Hilfe.
Gruß
cesupa
digi_c - Do 23.02.06 09:05
Also Zeilenumbrüche,... sollten sowas nicht nicht hervorrufen.
Ich denke das da nun etwas mit der Übertragung der Dateigröße nicht hinhaut. Das ist doch der einzige String, oder?
cesupa - Do 23.02.06 10:40
Also mit der Dateigröße funktioniert alles wunderbar, die wird mir dann ja auch richtig angezeigt, ich geb euch mal die Senderoutine:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Button3Click(Sender: TObject); var i,readed,gesendet:integer; dat1:file of byte; begin assignfile(dat1,edit1.Text); reset(dat1);
try cls1.Socket.SendText(inttostr(filesize(dat1))); repeat blockread(dat1,databuf2[0],sizeof(databuf2),readed); showmessage(inttostr(readed)); gesendet:=cls1.socket.SendBuf(databuf2,sizeof(databuf2)); until(readed<=0);
closefile(dat1); except showmessage('Fehler beim senden der Datei zu ' + cls1.host); end; end; |
Und hier nochmal die Empfangsroutine:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.client_read(Sender: TObject; Socket: TCustomWinSocket); var i,empf,w,prozent:integer; dat2:file of byte; begin
datalen1:=strtoint(Socket.receivetext);
memo1.Lines.add('Erwarte ' + inttostr(datalen1) + 'bytes große Datei' ); assignfile(dat2,dateiname); rewrite(dat2);
empf:=0;
repeat i:=Socket.ReceiveBuf(databuf1,sizeof(databuf2)); showmessage('I: ' + inttostr(i)); if i>0 then begin blockwrite(dat2,databuf1[0],i,w); memo1.lines.add(inttostr(i)); end;
until(i<=0); closefile(dat2); memo1.Lines.add('Datei empfangen!'); end; |
Wennn ich das Programm jetzt vom Explorer aus starte, zeigt mir die Empfangsroutine zu erst immer an, dass i=-1 ist, somit bricht die Empfangsroutine ab und wenn jetzt die Senderoutine sendet, kommt eine Fehler-Messagebox und gibt merkwürdige zeichen an, vermutlich aus der Datei, die gesendet wird.
Gruß
cesupa
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!