Dateien per TCP versenden
-
Guten Morgen,
Ich habe mich jetzt ne Stunde lang mit der Forensuche beschäftigt und teilweiße guten Informationen gefunden aber bekomme es einfach nicht hin das die Daten übertragen werden. Der Empfänger legt zwar die Datei an aber die größe der Datei bleibt 0 Byte
Senden
void SendFile(String ip) { if (Form1->ClientSocket1->Active) Form1->ClientSocket1->Active = false; Form1->ClientSocket1->Address = ip; Form1->ClientSocket1->Open(); if(Form1->ClientSocket1->Socket->Connected) { TFileStream *out = new TFileStream(Form1->OpenDialog1->FileName, fmOpenRead); out->Seek(0,soFromBeginning); char buf[1024]; int c,b; do { Form3->Label4->Caption = "Uploading..."; b = out->Read(buf,sizeof(buf)); c = Form1->ClientSocket1->Socket->SendBuf(buf,b); while(c == -1) { c = Form1->ClientSocket1->Socket->SendBuf(buf,b); } } while(b == sizeof(buf)); delete out; } }Empfangen
void __fastcall TForm1::ServerSocket1ClientWrite(TObject *Sender, TCustomWinSocket *Socket) { TFileStream *in = new TFileStream(Form2->Label1->Caption + "\\" + filelist->Values[Socket->RemoteAddress], fmCreate); int bytesReceived(0); do { char buf[1024]; bytesReceived = Socket->ReceiveBuf(buf, sizeof(buf)); in->Write(buf, bytesReceived); } while (bytesReceived != -1); delete in; }Darf ich überhaupt in einem Socket Event mit einer while Schleife arbeiten ?
Ist die Socket Komponente die richtige ?Ich hoffe ihr könnt mir nen Tip geben was schief läuft

David
-
Der Gedanke ist schon richtig... Du sollst events nicht mit Schleifen versehen... das geht nicht. Betrachte ein Event als eine Interrupt Service Routine.
Lies vielleicht mal den Beitrag zum Thema Protokollentwicklung durch.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-43712-and-highlight-is-*bild*+*senden*.html ist übrigens auch recht spannend.
-
Vielen Dank
In jedem dritten Beitrag wird irgendwo was eingeworfen was besser sein soll als einer der vorherigen Code abschnitte. Das erschlägt mich.
Ich möchte jeden File verschicken können. Soll ich FileStream oder MemoryStream verwenden ?Mir ist aufgefallen das in meinem oberen Beispiel beim senden niemals in Form3->Label4 "Uploading" eingetragen wird, mit anderen Worten muss er beim Senden schon früher aussteigen, aber was mache ich dabei nur falsch ?
wenn ich ja wenigstens ne Fehlermeldung bekommen würde, aber es wird alles ohne murren und knurren kompiliert und ausgeführt.
Was könnte das sein ? Die Verbindung steht da ich Socket Errors abfange und bei On Connected/Disconnect mir ebenfalls einen entsprechenden String im Label anzeigen lasse

-
Uploading wird eingetragen, sobald du dem Fenster zeit gibst, seine Nachrichten abzuarbeiten... Hatten wir hier schon öfters
Such mal kurz nach Appliaction::ProcessMessages in diesem Forum um mehr Infos zu erhalten.
Ausserdem versteh ich den Rest nicht... was wird wem wo angeworfen das du nicht vestehst?
-junix