Fehler bei Datei übertragung (TServerSocket)



  • Hallo alle zusammen,

    Ich hab ein Programm geschrieben, bei dem der Server (ServerSocket (blocking)) eine Datei an den Client (ClientSocket) schickt.
    Bei kleinen Dateien funktioniert dies auch ohne Probleme, aber bei Dateien über 8KB wird nur ein Teil der Datei übertragen.

    Woran kann das liegen???

    Bin für jede Hilfe dankbar.
    Hier ist der Code:

    für den Server (zum senden):

    void __fastcall TForm1::ServerSocket2GetThread(TObject *Sender,
          TServerClientWinSocket *ClientSocket,
          TServerClientThread *&SocketThread)
    {
       String pfad;
       pfad = ClientSocket->ReceiveText();
    
       TMemoryStream *StreamName = new TMemoryStream;
       StreamName->LoadFromFile(pfad);
       ServerSocket2->Socket->Connections[0]->SendStream(StreamName);
    
    }
    

    für den Client (zum empfangen und speichern):

    void __fastcall TForm1::ClientSocket2Read(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    TMemoryStream *Ziel = new TMemoryStream;
    
    int BufferGroesse = Socket->ReceiveLength();
    BYTE *Buffer_BYTEp = new BYTE[BufferGroesse];
    Socket->ReceiveBuf(Buffer_BYTEp, BufferGroesse);
    Ziel->Position;
    Ziel->WriteBuffer(Buffer_BYTEp, BufferGroesse);
    Ziel->Position = 0;
    Ziel->SaveToFile(ULpfad);
    delete [] Buffer_BYTEp;
    
    ClientSocket2->Active = false;
    }
    

    Danke schonmal im vorraus, bin echt am verzweifeln und kriegs einfach nicht hin.



  • Entschuldigung fuer den Doppelpost... aber ich kriegs einfach nicht hin.

    Gibt es hier denn niemand der mir helfen kann?

    Bin wirklich dankbar fuer jede noch so kleine Hilfe oder Denkanstoss der mich in die richtige Richtung lenken koennte.

    Danke



  • Mit Sockets hab ich mich noch nicht beschäftigt, aber normalerweise steht der Stream nach dem Einlesen am Ende des Streams und alle weiteren Aktionen werden von dieser Position aus durchgeführt.
    Versuch doch mal mittels Stream->Position = 0, den Stream auf den Anfang zu setzen.



  • Hallo,

    oder den Stream mittels SetSize vergrößern.

    mfg, Micha



  • RandomAccess85 schrieb:

    oder den Stream mittels SetSize vergrößern.

    Diesem Gedankengang kann ich irgendwie nicht folgen? Wieso sollte er den Stream vergrößern?



  • Hallo,

    weil er sagt dass nur Dateien bis zu einer Größe von 8kb vollständig übertragen werden.

    War nur nen Gedanke ...

    mfg, Micha



  • Ja, das hab ich nun davon, dass ich den Post nur überflogen habe. Damit dürfte sich mein Vorschlag sowieso erledigt haben, daran kann es dann ja nicht liegen...



  • Danke erstmal fuer euere Ideen.

    Aber leider hat es auch nichts genutzt die position auf 0 zu setzen.

    Es existiert immer noch dasselbe Problem; es werden nur ca. 8KB uebertragen.

    Hat vielleicht noch jemand eine Idee woran das liegen koennte bzw wie man das loesen kann??

    Danke.



  • Schau doch mal mit dem Debugger 'rein. Steht in BufferGroesse des Clients die ankommende Menge oder die erwartete Menge?



  • Muß es TServerSocket und TClientSocket sein?

    Unter Fastnet findest du NMStrm und NMStrmServ. Damit kanst du auch Dateien verschicken. In den Demos vom BCB6 findest noch ein Beispiel dazu.



  • L-A-U schrieb:

    Bei kleinen Dateien funktioniert dies auch ohne Probleme, aber bei Dateien über 8KB wird nur ein Teil der Datei übertragen.

    Das Senden kannst du schon so machen, nur das empfangen ist bei dir falsch.

    Das liegt daran, dass du die Datei immer wieder in 8kb Blöcken überschreibst.

    Sende dem Client erst die Dateigrösse damit du weisst wie gross die Datei ist, TMemoryStream hat ja eine Funktion die dir die grösse vom geladenen Stream anzeigt.

    Wenn du eine Datei versendest kommt die ja nicht gleich komplett an, die Datei wird in häppchen übertragen und DIE musst du wieder zur kompletten zusammen fügen.

    ReceiveText ist jedenfalls indirekt falsch da die Daten im Stream dann eben nur als ASCII ausgegeben werden und nicht binär wie es eigentlich sein sollte. Bei Chats o.ä. kann man das ja noch machen, bei Dateien ganz falsch.

    Du benutz Receivetext zwar nur um den Dateinamen zu übertragen bzw. zu lesen, aaaaber:

    Definier dir ein kleines Protkoll wo du den Dateinamen sowie die Dateigrösse senden kannst damit du im Client weisst wie gross die Datei ist und so lange liest Stream bis alle Bytes da sind.

    Und das OnRead im Clientsocket wird nur gefeuert wenn Daten im Netzwerkstream vorliegen (siehe Onlinehilfe).

    Jedenfalls solltest du (meiner Meinung nach) den Stream für die Zieldatei ausserhalb dem OnRead definieren - wie gesagt - so überschreibst du die bestehende Datei immer und immer wieder.

    [/Senf]


Anmelden zum Antworten