Probleme mit Serverprozess und/oder Struktur



  • Hallo zusammen und ein gesundes neues Jahr,

    ich schreibe gerade an einem Programm für das Raspberry Pi (RbP), um zu Hause meine Funksteckdosen steuern zu können:

    librsswitch.c

    /**                                                                                                                                                                     
     * Configure struct for the PT2260 encoder                                                                                                                              
     * @param pt2260     Pointer to a pt2260 instance                                                                                                                       
     */
    int pt2260_init(Encoder *pt2260)
    {
            if(!bcm2835_init()) {
    	        fputs("Cannot init bcm2835\n", stdout);
    	        return -1;
            }
    
            /* Set the pin to be an output */
    	    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
    
    	    char *groups[] = {"1FFF", "F1FF", "FF1F", "FFF1"};
            char *sockets[] = {"1FF0", "F1F0", "FF10"};
    	    char *data[] = {"0001", "0010"};
            int i;
    
            /* Four possible switch groups */
            pt2260->ngroups = 4;
            pt2260->groups = (char **)malloc(pt2260->ngroups * sizeof(char *));
            if (pt2260->groups == NULL) {
                    fputs("Error: Cannot malloc\n", stdout);
                    return -1;
            }
            /* Three possible switches per group */
            pt2260->nsockets = 3;
            pt2260->sockets = (char **)malloc(pt2260->nsockets * sizeof(char *));
            if (pt2260->sockets == NULL) {
                    fputs("Error: Cannot malloc\n", stdout);
                    return -1;
            }
    
            /* Data is either "On" or "Off" */
            pt2260->ndata = 2;
            pt2260->data = (char **)malloc(pt2260->ndata * sizeof(char *));
            if (pt2260->data == NULL) {
                    fputs("Error: Cannot malloc\n", stdout);
                    return -1;
            }
    
            for (i = 0; i < pt2260->ngroups; i++) {
                    strcpy((char *)&pt2260->groups[i], (char *)&groups[i]);
            }
    
    #ifdef DEBUG
            puts("Going to crash now");
            for (i = 0; i < pt2260->ngroups; i++) {
                    printf("DBG: %s\n", pt2260->groups[i]);
            }
    #endif
            for (i = 0; i < pt2260->nsockets; i++) {
                    strcpy((char *)&pt2260->sockets[i], (char *)&sockets[i]);
            }
    
            for (i = 0; i < pt2260->ndata; i++) {
                    strcpy((char *)&pt2260->data[i], (char *)&data[i]);
            }
    
            return 0;
    }
    
    int socket_send(uint group, uint socket, uint data)
    {
     	    Encoder pt2260;
    
            pt2260_init(&pt2260);
    
    #ifdef DEBUG
            puts("DBG: Done pt2260_init()");
    #endif
    
          	pt2260_ctrl(&pt2260, group, socket, data);
    
            return 0;
    }
    

    Für den ersten Test habe ich ein Programm send.c geschrieben, das die Funktionalität prüfen soll:

    send.c

    #include "rsswitch.h"
    
    int main(void)
    {
            /* Group B, Switch 1, On */
            socket_send(1, 0, 1);
            return 0;
    }
    

    $ gcc -Wall -DDEBUG -o send send.c librsswitch.c -l rt -l bcm2835
    $ sudo ./send
    Going to crash now
    DBG: 1FFF
    DBG: F1FF
    DBG: FF1F
    DBG: FFF1
    DBG: Done pt2260_init()

    Das ganze funktioniert prinzipiell, ich kann die Steckdose damit ein- und ausschalten. Hier zum eigentlichen Problem:

    Ich möchte das Ganze nun in eine Server-Applikation einbinden, welche auf dem RbP läuft und Befehle über das Netzwerk entgegennimmt:

    mrfbd.c

    while(1) {
                    connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &cli_len);
                    /* Log clients IP address. */
                    inet_ntop(AF_INET, &cli_addr.sin_addr,
                              cli_ipaddr, sizeof(cli_addr));
    		    syslog(LOG_NOTICE, "Client from %s connected.", cli_ipaddr);
    	    	while ( (n = read(connfd, recbuf, sizeof(recbuf)-1)) > 0) {
                            recbuf[n] = 0;
                            if (recbuf[0] == '0') {
                                    ...
                            } else if (recbuf[0] == '1') {
    				                ...
                            } else if (recbuf[0] == '2') {
    				                ...
                            } else if (recbuf[0] == '3') {
                                    syslog(LOG_NOTICE, "RSS Control");
                                    socket_send(1, 0, 1);
                            }
    

    $ gcc -Wall -DDEBUG -o mrfbd mrfbd.c librsswitch.c -l rt -l bcm2835
    $ sudo ./mrfbd
    Going to crash now

    Wenn ich jetzt mit einem Client '3' an das RbP schicke, dann beendet sich der Serverprozess ohne Fehlermeldung.

    Er scheint beim Zugriff auf pt2260->groups[i] abzustürzen.

    Kann mir jemand sagen warum?

    Vielen Dank im Voraus.



  • Was sagt der Compiler denn, wenn du sämtliche Casts in pt2260_init weglässt? Die sind nämlich alle unnötig oder falsch.



  • TyRoXx schrieb:

    Was sagt der Compiler denn, wenn du sämtliche Casts in pt2260_init weglässt? Die sind nämlich alle unnötig oder falsch.

    Hallo TyRoXx,

    schonmal vielen Dank für deine Antwort! Ich habe alle Casts weggelassen, hier der Compiler Output:

    librsswitch.c: In function ‘pt2260_init’:
    librsswitch.c:131:3: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from rsswitch.h:3:0,
    from librsswitch.c:1:
    /usr/include/string.h:125:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
    librsswitch.c:131:3: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from rsswitch.h:3:0,
    from librsswitch.c:1:
    /usr/include/string.h:125:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’
    librsswitch.c:141:3: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from rsswitch.h:3:0,
    from librsswitch.c:1:
    /usr/include/string.h:125:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
    librsswitch.c:141:3: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from rsswitch.h:3:0,
    from librsswitch.c:1:
    /usr/include/string.h:125:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’
    librsswitch.c:145:3: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from rsswitch.h:3:0,
    from librsswitch.c:1:
    /usr/include/string.h:125:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
    librsswitch.c:145:3: warning: passing argument 2 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from rsswitch.h:3:0,
    from librsswitch.c:1:
    /usr/include/string.h:125:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char **’

    Hier noch die Deklaration des structs in der Datei rsswitch.h:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <bcm2835.h>
    
    typedef struct{
            char **groups;
            uint ngroups;
            char **sockets;
            uint nsockets;
            char **data;
            uint ndata;
            uint pulse_len;
    } Encoder;
    

    Leider weiß ich mit den Compilerausgaben nicht wirklich etwas anzufangen.
    **
    char groups;

    Dann ist doch pt2260->groups[i] vom Typ **Char ***, oder?



  • Nochmal danke, TyRoXx,

    du bist mein Held!


Anmelden zum Antworten