socket buffer size dynamische grösse



  • Hallöchen,

    ich hab mal wieder ein kleines problem bzw eine Frage.

    Mit Sockets verbinde ich in meinem testprogramm zu meinem webserver an ein php script, die rückgabewerte haben ja logischerweisse unterschiedliche längen.

    Momentan lege ich die grösse der puffer manuell fest(300 Zeichen):

    while((rc=recv(s,recv_buf,recv_buf_size,0))>0)
    

    Sobald aber der string länger als 300 ist gibts ein SIGSEV.

    Jetzt zu der Frage, kann ich den empfangspuffer dynamisch nach der länge des strings vom webserver anlegen?

    Grüsse Spirit



  • char *ret = malloc(sizeof(char) * ermittel_groesse_von_string());
    ret = ...;
    free(ret);
    


  • Spirit/BLACKDIAMONT schrieb:

    Momentan lege ich die grösse der puffer manuell fest(300 Zeichen):

    while((rc=recv(s,recv_buf,recv_buf_size,0))>0)
    

    Sobald aber der string länger als 300 ist gibts ein SIGSEV.

    Jetzt zu der Frage, kann ich den empfangspuffer dynamisch nach der länge des strings vom webserver anlegen?

    Grüsse Spirit

    Ob du nicht ausreichenden Speicher nun statisch oder dynamisch reservierst, spielt keine Rolle. Es bleibt UB. Der Compiler/Laufzeitsystem hat recht.
    Lass mich raten, du hast in etwas in der Form:

    #define recv_buf_size 300
    char recv_buf[recv_buf_size];
    while((rc=recv(s,recv_buf,recv_buf_size,0))>0)
    {
      recv_buf[rc]=0;  /* hier knallt es; sei froh, so bemerkst du wenigstens deinen Fehler; wenn rc==300 versuchst du, recv_buf[300] zu beschreiben, was UB bedeutet, weil nur 0..299 erlaubt ist */
    

    Also einfach 1 Byte mehr spendieren, und es sollte laufen:

    char recv_buf[recv_buf_size+1];
    


  • Jep so ist es, deswegen dachte ich an dynamische grösse habe bisher noch nicht weiter geschaut.
    Momentan überschlage ich grob die ausgabelänge, aber finde ich weniger sinnvoll...


Anmelden zum Antworten