| Autor |
Beitrag |
cesupa
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 22.02.06 16:54
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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 22.02.06 17:44
Ja, also die Datei-Größe wird korrekt empfangen, damit gibts keine probleme.
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 22.02.06 17:58
Hat leider auch nix gebracht.
|
|
Tastaro
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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:
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
|
|
|