Merkwürdiger String-Kopier verhalten



  • Und nur so, es gibt auch strcpy



  • columbus schrieb:

    Die Struktur leader wird dann über das Netzwerk verschickt und auf der Gegenseite ausgelesen. Aber hier bricht der nach "bild" ab. Der String hat also nur den Wert: "/home/chris/bild"

    wie verschickst du's denn? wertest du auch die rückgabewerte von send() und recv() aus? nichtbeachtung (von einem oder beiden) ist ein oft gemachter anfängerfehler.
    🙂



  • Also die Struktur sieht in etwa so aus:

    typedef struct file_leader
    {
    	struct generic_leader	leader;
    	int32_t	payload_MSB;
    	int32_t	payload_LSB;
    	int8_t	filename[64];
    }file_leader;
    

    falls das Programm unter Win32 erzeugt wird, wird für int32_t DWORD und für int8_t BYTE verwendet. Deshalb konnte ich auch kein strcpy oder strncpy verwenden.
    Ich verwende UDP mit sendto und recvfrom. So wie es aussieht wird wohl wirklich was abgeschnitten. Mal nach 15 oder 16 Byte ist schluss. Den Rückgabewert von recvfrom und sendto werte ich aus und man kann auch noch die anderen Werte aus der Struktur lesen. Also es kommt schon was an, aber der String wird nicht sauber übertragen.

    Gruss Christian



  • columbus schrieb:

    Also es kommt schon was an, aber der String wird nicht sauber übertragen.

    bei UDP kommt entweder alles an oder nichts. zeig mal die zeile mit deinem sendto-aufruf. die längenangabe muss sizeof(struct file_leader) sein.
    🙂



  • Das ist sie:

    if((sendbytes = sendto(contact_socket,
    					       &leader,
    					       sizeof(struct file_leader),
    					       0,
    					       (struct sockaddr *)toAddress, len)) == -1)
    	{
    		printf("sendto-Error1 %s \n", strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    

    Gruss Christian



  • sieht eigentlich OK aus. ist 'senbytes' nach dem senden auch sizeof(struct leader)? wenn ja, dann zeig mal deinen 'revfrom'-aufruf.
    🙂



  • recv_bytes = recvfrom(contact_socket,
    						  pBuffer,
    						  MAX_GVSP,
    						  0,
    						  NULL, NULL);
    
    	if(0 > recv_bytes)
    	{
    		printf("error while receiving the packet-leader %s\n", strerror(errno));
    		return -1;
    	}
    

    Ich weiss nicht woran es lag, aber es funktioniert jetzt. Ich habe einige Änderungen durchgeführt und so wie es aussieht eine ganze Weile auf eine alte Version zugegriffen (auf Serverseite)

    Frage:
    bisher habe ich immer folgendes gemacht um structs zu definieren und auch als Datentyp zu deklarieren:

    typedef struct my_header
    {
    	type_16 	status;
    	type_16	block_id;
    	type_8		packet_format;
    	type_8		packet_id[3];
    }my_header;
    

    das habe ich jetzt durch ein kleines underscore geändert:

    typedef struct _my_header
    {
    	type_16 	status;
    	type_16	block_id;
    	type_8		packet_format;
    	type_8		packet_id[3];
    }my_header;
    

    Kann das der Fehler gewesen sein?

    Gruss Christian



  • columbus schrieb:

    Kann das der Fehler gewesen sein?

    eher nicht. namen von typedefs und structs sind in getrennten namensräumen. da fällt mir ein: compilierst du deinen code vielleicht als c++ (dateiendung .cpp statt .c)?
    🙂



  • +fricky schrieb:

    columbus schrieb:

    Kann das der Fehler gewesen sein?

    eher nicht. namen von typedefs und structs sind in getrennten namensräumen. da fällt mir ein: compilierst du deinen code vielleicht als c++ (dateiendung .cpp statt .c)?
    🙂

    yepp, das tue ich.



  • columbus schrieb:

    yepp, das tue ich.

    dann ändere es schnell. würde mich nicht wundern, wenn deine ursprüngliche typedef/struct-benamung nicht c++ kompatibel ist. c++ ist furchtbar fehleranfällig.
    🙂



  • do {
       leader.filename[index] = filename[index];
       index++;
    } while(filename[index] != '\0');
    

    Du kopierst die \0 nicht mit.



  • Ich brauche C++, da u.a. meine liebste Log-Bibliothek für C++ geschrieben ist. Man muss halt ein bisschen genauer hinschauen.
    Das mit dem fehlenden \0 ist ein wichtiger Hinweis. Es funktioniert zwar jetzt, aber sowas kann immer wieder zu neuen Fehlern führen.

    Dank Euch auf jeden Fall.

    Gruss Christian


Anmelden zum Antworten