popen speichern -> sockets



  • CStoll schrieb:

    Grenzen für einen char-Pointer gibt es nur eine: den von dir reservierten Speicherbereich. Wenn du mehrere Zeilen hintereinander schreiben willst - mit strlen(line) ermittelst du die Länge der Zeile, mit line+strlen(line) die Position, an der du weiterschreiben kannst.

    (und eine Möglichkeit wäre es auch, die Daten stückweise zu senden)

    Das mit den Daten stückweise senden geht leider nicht, weil das externe Programm nachher statt des ping-Kommandos eine Netzwerkmessung durchführen soll und das Program selbst dann keinen Traffic verursachen darf.

    Meinst du denn also ich soll den Pointer mit den sendedaten immer erhöhen und den Inhalt der zeile hinten anfügen? ist denn die Rückgabe von fgets nicht immer mit '\0' terminiert?

    Ich habe mich ein bisschen umgesehen und bin auch auf die Möglichkeit gestoßen imt fread zuarbeiten:

    zahl=fread(sendedaten,1,10,fp);
    printf("OUTPUT: %s\n", sendedaten);
    

    Hier gibts es ja auch keine Möglichkeit die Länge der gelesenen Daten zu ermitteln oder?
    Die Länge brauch ich ja unbedingt für den send-Befehl am Socket 😢



  • OK habe erst jetz glaube ich registriert wie du das gemeint hast, also sollte ich eine Art positions-Wert einfügen mit der aktuellen Position des Pointers und dann einfach immer den String der aktuellen Zeile hinzufügen und die Position um die strlen(line) erhöhen für die näcshte zeile, werd das mal probieren 😉



  • LordAndy1984 schrieb:

    CStoll schrieb:

    Grenzen für einen char-Pointer gibt es nur eine: den von dir reservierten Speicherbereich. Wenn du mehrere Zeilen hintereinander schreiben willst - mit strlen(line) ermittelst du die Länge der Zeile, mit line+strlen(line) die Position, an der du weiterschreiben kannst.

    (und eine Möglichkeit wäre es auch, die Daten stückweise zu senden)

    Das mit den Daten stückweise senden geht leider nicht, weil das externe Programm nachher statt des ping-Kommandos eine Netzwerkmessung durchführen soll und das Program selbst dann keinen Traffic verursachen darf.

    OK, in dem Fall ist es tatsächlich schwierig, wenn du etwas außer der Reihe senden willst.

    Meinst du denn also ich soll den Pointer mit den sendedaten immer erhöhen und den Inhalt der zeile hinten anfügen? ist denn die Rückgabe von fgets nicht immer mit '\0' terminiert?

    Genau das ist es - und darauf baisert auch die obige strlen()-Konstruktion.

    Ich habe mich ein bisschen umgesehen und bin auch auf die Möglichkeit gestoßen imt fread zuarbeiten:

    zahl=fread(sendedaten,1,10,fp);
    printf("OUTPUT: %s\n", sendedaten);
    

    Hier gibts es ja auch keine Möglichkeit die Länge der gelesenen Daten zu ermitteln oder?

    Hier geht es sogar noch einfacher - fread() gibt die Anzahl gelesener Datensätze (der zweite Parameter gibt an, wie groß ein Datensatz ist) als Rückgabewert raus.

    PS: Bei allen Ansätzen solltest du aber bedenken, daß du vor dem Füllen genug Speicher angefordert hast, sonst hagelt es Speicherfehler (oder schlimmeres).



  • Ich werde es heute Abend mal mit beiden Ansätzen probieren, mit strlen und mit fread, nur weiß ich nicht ob fread wenn man mit einem Pointer arbeitet tatsächlich die Länge der gelesenen Daten zurückgibt, sondern nur wenn man einem Array arbeitet.

    Und das mit dem Speicher ist genau mein Problem, wieviel ist GENUG, da ich das ja im vorhinein nicht genau wissen kann wie viel Daten die Anwendung in der Shell ausgibt und ich nicht will dass mein Pointer so groß wird dass er andere Dateien zerstört was sicher unangenehm wäre *g*



  • LordAndy1984 schrieb:

    Ich werde es heute Abend mal mit beiden Ansätzen probieren, mit strlen und mit fread, nur weiß ich nicht ob fread wenn man mit einem Pointer arbeitet tatsächlich die Länge der gelesenen Daten zurückgibt, sondern nur wenn man einem Array arbeitet.

    Arrays werden bei der Übergabe als Parameter implizit in Zeiger umgewandelt - und der Funktion fread() ist es egal, ob sie ihre Daten in ein lokales Array oder auf den Heap schreiben soll.

    Und das mit dem Speicher ist genau mein Problem, wieviel ist GENUG, da ich das ja im vorhinein nicht genau wissen kann wie viel Daten die Anwendung in der Shell ausgibt und ich nicht will dass mein Pointer so groß wird dass er andere Dateien zerstört was sicher unangenehm wäre *g*

    Ja, das ist ein Problem - im generellen Fall kannst du erst hinterher feststellen, wieviel "genug" ist. Da bietet sich als beste Lösung an, den Speicher während der Arbeit mitwachsen zu lassen - im besten Fall nimmst du einen STL vector oder string für die Speicherung:

    string input_data;
    char line[100];
    while(!feof(sendedaten))
    {
      int zahl = fread(sendedaten,1,100,line);
      input_data.append(line,zahl);
    }
    
    send(target,input_data.data(),input_data.length());
    


  • Siehste an vector hab ich garnit gedacht, meine c++ Vorlesungen sind doch schon etwas länger her 😉

    Danke für die vielen Antworten werd ich heute probieren 😉



  • Ich habs jetzt derzeit mit std::string gelöst, da funktionierts einigermaßen, habe ich dadurch eigentlich irgendwelche Performancenachteile?

    Ich habs mit normalen char* pointern einfach nicht hinbekommen, immer ist ein Segmentation Fault gekommen, ich nehme an ich hab irgendwas mit der Speicherreservierung oder der Zuweisung falsch gemacht 😢



  • Eigentlich sind strings so konzipiert, daß sie konstante Zugriffszeiten haben. Aber womöglich kannst du es etwas beschleunigen, indem du am Anfang per reserve() angibst, wie groß der String werden kann (wenn du dich da verschätzt, stört das auch nicht weiter - im Gegensatz zur char* Verarbeitung).



  • OK, Vielen Dank für die Hilfe, dann mach ich das jetz mal so, und vielleicht hab ich ja noch eine Erleuchtung dann änder ichs wieder auf char* um wenn ich mich mit den ganzen strlens, * und & zurechtfinde *g*



  • LordAndy1984 schrieb:

    und vielleicht hab ich ja noch eine Erleuchtung dann änder ichs wieder auf char* um wenn ich mich mit den ganzen strlens, * und & zurechtfinde *g*

    Lass das lieber - std::string wurde entwickelt, damit du dich nicht mehr mit "den ganzen strlens, * und &" herumärgern mußt 😉


Anmelden zum Antworten