char* builder



  • @ CStoll ok danke das hat geklappt... aber iwie hab ich das Problem immer noch 😞
    Die verdammte übertragung klappt nicht 100% ich schicke alle 25 Packete eine bestätigung vom Server und warte alle 25 beim CLienten auf eine Antwort... aber es klappt nicht ?! die DAtei ist 327 mb groß und es kommen immer unterschiedliche DAteien dabei heraus .. einmal nur 240 mb einmal 270 ... manchmal sogar 300.... woran kann das liegen ? sind etwa 1024 bytes in einer endlos schleife zuviele (25)?
    oder muss ich nach jedem packet auf eine resonanz warten ? das habe ich auch schon probiert... aber dann is es ziemlich langsam vorallem wenn ich das übers internet mache! wenn ich ein packet schicke und dann auf eine antwort warte... weil man ja im internet als normal bürger nen ziemlich langsamen upload hat.... also hast du ne idee woran das liegt?!?!
    und danke schonmal für deine idee!

    Gruß Chris



  • Kann sein, daß der drunterliegende Socket deine Datei in etwas handlichere Stücke zerlegt hat, um sie übers Netz zu senden - wertest du denn auf der Empfänger-Seite aus, ob und wieviel Daten angekommen sind? (wenn weniger als die angeforderte Menge angekommen ist, ist vermutlich noch ein Teil unterwegs)



  • Benutzt Du beim Zusammenstellen oder Zerlegen der Pakete str*-Funktionen? strlen z.B. wäre tödlich, wegen der Nullterminierung. Beachte, dass binäre Daten das Nullbyte als gültiges Datum enthalten können.

    Falls es das ist: Du musst den Rückgabewert von recv beachten und wenn der > 0 ist diesen Wert als Länge der Daten benutzen.



  • Also wenn du Daten an einen Socket sendest oder Daten empfängst, garantiert die die Sende- bzw. Empfangsfunktion nicht, dass alle Daten gesendet oder empfangen wurden.

    Du musst nach jedem Senden oder Empfangen prüfen, wieviele Daten übertragen wurden (Rückgabewert) und ob das wirklich alle Daten gewesen sind, die übertragen werden sollten.

    Ist das nicht der Fall, so musst du erneut senden bzw. empfangen (EDIT: Den noch nicht gesendeten Teil der Daten natürlich, Empfang: dto.).

    Grüße...

    Heiko



  • ja strlen benutze ich nicht ... auch das kopieren wird mit memcpy gemacht 😉
    hmm das heißt falls es zu wenig daten sind MUSS ich ne anforderung für die packete machen, die sind vollständig angekommen sind...



  • Du kannst das Lesen und Schreiben z.B. mit einer Schleife lösen, um sicherzustellen dass alles gesendet wurde. Beim Lesen würde ich zuerst sizeof(int) lesen und dann in einer Schleife genau so viel. Sinngemäß:

    int laenge;
    if (recv(socket, &laenge, sizeof(int)) != sizeof(int)) {
        // Problem
    }
    
    int gelesen = 0;
    char* buffer = new char[laenge];
    while (gelesen < laenge) {
        int teilgelesen = recv(socket, buffer + gelesen, laenge - gelesen);
        if (teilgelesen <= 0) {
            // bei 0 hat der Schreiber einfach zu gemacht ohne genug zu schreiben
            // bei < 0 -> Problem
        }
        gelesen += teilgelesen;
    }
    


  • ahhh DANKE! ok hinten dran noch ein delete[] und alles sollte klappen, gute idee mit der zeiger arithmetik einfach hochzählen lassen und dann emfpangen danke!
    Mal schauen obs klappt..



  • CStoll schrieb:

    Mein Vorschlag - du packst die Größenangabe an den Anfang des struct's

    lieber cstoll,

    ich habe respekt vor deinem umfangreichen wissen und finde es bewundernswert, wie du den noobs immer hilfreich zur seite stehst und auf so viele fragen gute antworten hast.
    aber dass du das genetiv-s immer apostrophierst, das geht mir echt tierisch auf die nüsse.

    http://www.deppenapostroph.de

    nix für ungut, du bleibst trotzdem mein held.



  • ok das hat nun endlich geklappt!!! vielen dank, das war hilfreich

    Gruß Chris



  • einer muss es mal sagen schrieb:

    aber dass du das genetiv-s immer apostrophierst, das geht mir echt tierisch auf die nüsse.

    http://www.deppenapostroph.de

    Mache ich doch gar nicht immer, sondern nur wenn es auf englisch-sprachliche Fachausdrücke prallt. Ist vielleicht die Macht der Gewohnheit, aber irgendwie sieht "structs" verwirrender aus als "struct's".
    (zum Glück habe ich die Schulzeit hinter mir :D)


Anmelden zum Antworten