problem mit malloc/calloc und free



  • hi,

    ich habe eine client-server kommunikation mit sockets vor. dabei soll es eine funktion Send(SOCKET sock, char *sSendBuffer) geben die den string sSendBuffer mit dem socket sock versendet.

    im programm schaut der aufruf dann so aus:

    int ByteSent = Send(mySocket, "blubb");
    

    das problem ist aber, dass der puffer sSendBuffer nicht geleert wird sondern jedesmal beim nochmaligem aufruf einfach der neue string hinten angehängt wird...

    ein free(sSendBuffer) bringt mir das programm zum abstürzen, ebenso ein strncpy(sSendBuffer, NULL, 1);...

    welche möglichkeiten hab ich hier um den sendepuffer zu leeren?

    hier ist die Send funktion:

    int Send(SOCKET sock, char *sSendBuffer)
    {
    	int iBufferLength = strlen(sSendBuffer);
    	char *sendbuf = NULL;
    
    	sendbuf = (char *) calloc(iBufferLength, sizeof(char));
    	strncpy(sendbuf, sSendBuffer, iBufferLength-1);
    
    	send(sock, sendbuf, strlen(sendbuf), 0);
    
    	free(sendbuf);
    
    	return iBufferLength;
    }
    

    danke schonmal und noch einen schönen abend.

    root2



  • Mir scheint, du baust da irgendwie mit der Pufferlänge Mist.
    strlen(sSendBuffer) gibt doch die Anzahl die Zeichen zurück, ohne die abschließende Null.

    Also bei der Reservierung eins dazu, und beim Kopieren das "-1" weglassen.

    Achja:
    strncpy(sSendBuffer, NULL, 1) führt zum Absturz, da das OS auch den lesenden Zugriff auf diese Speicherstelle darauf dir nicht erlaubt.

    Ist es nötig, das du den Puffer gleich im zuge der Reservierung mit Nullen füllst ?
    Du füllst ihn doch gleich danach.



  • danke dir erstmal...

    code geändert auf:

    int Send(SOCKET sock, char *sSendBuffer)
    {
    	int iBufferLength = strlen(sSendBuffer);
    	char *sendbuf;
    
    	sendbuf = (char *) calloc(iBufferLength + 1, sizeof(char));
    	strncpy(sendbuf, sSendBuffer, iBufferLength);
    
    	send(sock, sendbuf, strlen(sendbuf), 0);
    	free(sendbuf);
    
    	return iBufferLength;
    }
    

    stürzt zwar nicht mehr ab, schreibt jetzt aber leerzeichen in den puffer... 😞
    d.h. ein aufruf in der form

    int ByteSent = Send(mySocket, "123\n");
    int ByteSent = Send(mySocket, "456\n");
    int ByteSent = Send(mySocket, "789\n");
    

    bringt wenn ich mit telnet verbinde:
    123
    ___456
    ______789

    "_" ist ein leerzeichen.

    komif... 😕

    root2



  • Hmm, bist du sicher, dass der gesendete Puffer die Leerzeichen enthält?
    Schau am besten mal mit dem Debugger nach, oder lass dir den Puffer vorher mal testweise lokal ausgeben.



  • hi nochmal,

    das mit dem debugger ist so eine sache 😉 der server läuft auf einem sorcus pc modul ohne display unter windows ce und unterstützt kein printf 😉

    aber ich hab mit ethereal mal den tcp stream angeguggt und die leerzeichen werden wirklich nicht mit übertragen...

    telnet mag anscheinend das \n nicht sondern nur \f\r 😉

    nu klappt alles wie es soll.

    danke für die hilfe.

    root2



  • root2 schrieb:

    telnet mag anscheinend das \n nicht sondern nur \f\r 😉

    Das sollte bei telnet aber einstellbar sein. Möglicherweise hättest du auch ein \r\n übertragen müssen, d. h. einen Wagenrücklauf und eine neue Zeile. Bei nur \n macht er anscheinend nur eine neue Zeile, aber an mit der gleichen X-Position (Spalte). Ein \f ist ja eigentlich ein Seitenwechsel.


Anmelden zum Antworten