Autor Beitrag
cesupa
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.

ausblenden 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); //Datengröße der zu empfangenden Datei empfangen
setlength(databuf1,1024);               //Buffer setzen

memo1.Lines.add('Erwarte ' + inttostr(datalen1) + 'bytes große Datei' );

sd1.execute;                            //Speicher-Dialog öffnen
assignfile(dat2,sd1.filename);           //Datei öffnen
rewrite(dat2);

empf:=0;

repeat                                 //Empfangsroutine
Socket.ReceiveBuf(databuf1,i);         //Daten Empfangen

blockwrite(dat2,databuf1,i,w);         //in Datei schreiben

//memo1.lines.add(inttostr(empf));
//empf:=empf+i;

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 user profile iconraziel: Delphi-Tags hinzugefügt
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 22.02.06 17:44 
Ja, also die Datei-Größe wird korrekt empfangen, damit gibts keine probleme.
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 22.02.06 17:58 
Hat leider auch nix gebracht.
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 22.02.06 18:14 
Okay, ich hab das jetzt so hier umgeändert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
repeat
i:=Socket.ReceiveBuf(databuf1,1024);

blockwrite(dat2,databuf1,i,w);
//memo1.lines.add(inttostr(empf));
//empf:=empf+i;
until(i<=0);


Es kommen aber noch immer die gleichen Fehler.

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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:

ausblenden 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);                             //Datei öffnen
     reset(dat1);

     try
     cls1.Socket.SendText(inttostr(filesize(dat1)));          //Dateigröße senden

     repeat
     blockread(dat1,databuf2[0],sizeof(databuf2),readed);     //Datei auslesen
     showmessage(inttostr(readed));                           //anzeigen, wieviel Daten gelesen wurden
     gesendet:=cls1.socket.SendBuf(databuf2,sizeof(databuf2));//Daten senden
     until(readed<=0);

     closefile(dat1);
     except
     showmessage('Fehler beim senden der Datei zu ' + cls1.host);
     end;
end;


Und hier nochmal die Empfangsroutine:

ausblenden volle Höhe 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); //Dateigröße empfangen...


memo1.Lines.add('Erwarte ' + inttostr(datalen1) + 'bytes große Datei' ); //und ausgeben

assignfile(dat2,dateiname);  //Datei öffnen
rewrite(dat2);

empf:=0;

repeat
//showmessage('Beginne mit Transfer!');
i:=Socket.ReceiveBuf(databuf1,sizeof(databuf2));        //Daten erhalten (i=-1) ???
 showmessage('I: ' + inttostr(i));
 if i>0 then                                            //Wenn daten gesendet wurden, 
 begin
blockwrite(dat2,databuf1[0],i,w);                        //in Datei schreiben
memo1.lines.add(inttostr(i));
  end;

//empf:=empf+i;
until(i<=0);                                             //Wenn keine Daten mehr ankommen oder ein Fehler eintrat, Schleife beenden

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