UDP Broadcast sendto und recvfrom. recv schlägt fehl



  • Hallo!

    bei meinem kleinen Testprogramm schläft der Empfang fehl!

    Der Sinn des Programmes soll folgender sein:

    - Es sendet ein Broadcast auf Port 7090 mit dem Inhalt "i".
    - Nur ein client fühlt sich angesprochen und sendet einen String an den Broadcastsender auf Port 7090 zurück.

    Ich bekomme aber nur mein "i" zurück und nicht die Daten, die als Antwort auf das i gesendet werden. Kann hier jemand helfen?

    #include <stdio.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    #define BUFLEN 2048  //Max length of buffer
    
    int main(int argc, char *argv[])
    {
        int sock;                         /* Socket */
        struct sockaddr_in broadcastAddr; /* Broadcast address */
        struct sockaddr_in clientAddr;    /* client address */
        char *broadcastIP;                /* IP broadcast address */
        char *clientIP;                   /* IP client address */
        unsigned short broadcastPort;     /* Broadcast port */
        unsigned short clientPort;        /* client port */
        char *sendString;                 /* String to broadcast */
        char recvString[BUFLEN+1];        /* Buffer for received string */
        int broadcastPermission;          /* Socket opt to set permission to broadcast */
        unsigned int sendStringLen;       /* Length of string to broadcast */
        unsigned int recvStringLen;       /* Length of received string */
    
        broadcastIP = "255.255.255.255";            /* broadcast IP address */
        broadcastPort = 7090;                       /* broadcast port */
        clientIP = "192.168.10.9";                  /* client IP address */
        clientPort = 7090;                          /* client port */
        sendString = "i";                           /* string to broadcast */
    
        /* Create socket for sending/receiving datagrams */
        if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
            printf("socket() failed");
    
        /* Set socket to allow broadcast */
        broadcastPermission = 1;
        if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission, sizeof(broadcastPermission)) < 0)
            printf("setsockopt() failed");
    
        /* Construct broadcast address structure */
        memset(&broadcastAddr, 0, sizeof(broadcastAddr));      /* Zero out structure */
        broadcastAddr.sin_family = AF_INET;                    /* Internet address family */
        broadcastAddr.sin_addr.s_addr = inet_addr(broadcastIP);/* Broadcast IP address */
        broadcastAddr.sin_port = htons(broadcastPort);         /* Broadcast port */
    
        /* Construct client address structure */
        memset(&clientAddr, 0, sizeof(clientAddr));            /* Zero out structure */
        clientAddr.sin_family = AF_INET;                       /* Internet address family */
        clientAddr.sin_addr.s_addr = inet_addr(clientIP);      /* client IP address */
        clientAddr.sin_port = htons(clientPort);               /* client port */
    
        sendStringLen = strlen(sendString);  /* Find length of sendString */
    
        /* bind local port for sending */
        if (bind(sock, (struct sockaddr *) &broadcastAddr, sizeof(broadcastAddr)) < 0)
            printf("bind() failed");
    
        /* Broadcast sendString in datagram */
        if (sendto(sock, sendString, sendStringLen, 0, (struct sockaddr *) &broadcastAddr, sizeof(broadcastAddr)) != sendStringLen)
            printf("sendto() failed");
    
        /* Receive a single datagram from one client */
        if ((recvStringLen = recvfrom(sock, recvString, BUFLEN, 0, NULL, 0)) < 0)
            printf("recvfrom() failed");
    
        recvString[recvStringLen] = '\0';
        printf("Received: %s\n", recvString);
    
        close(sock);
        exit(0);
    
    }
    


  • Du empfängst eben die Nachricht die du selbst gesendet hast, dass ist ganz normal.
    Client Code?
    benutze perror() damit du auch fehlermeldungen bekommst
    sendStringLen und recvStringLen sollten vom typ ssize_t sein (siehe manpage sendto recvfrom).
    warum nicht einfach return 0; anstatt exit(0); oder sogar return EXIT_SUCCESS;



  • gary1195 schrieb:

    Du empfängst eben die Nachricht die du selbst gesendet hast, dass ist ganz normal.

    Danke für die Bestätigung 😞 Das war ja nicht meine Frage!

    gary1195 schrieb:

    Client Code?

    ja

    gary1195 schrieb:

    benutze perror() damit du auch fehlermeldungen bekommst

    jetzt drin, kommt aber nichts. egal, habe es anders gelöst.

    gary1195 schrieb:

    sendStringLen und recvStringLen sollten vom typ ssize_t sein (siehe manpage sendto recvfrom).
    warum nicht einfach return 0; anstatt exit(0); oder sogar return EXIT_SUCCESS;

    [/quote]

    ssize_t habe ich abgeändert! Danke

    return 0 war drin, habe es nur aus einer funktion der übersichtlichkeit ausgeschnitten. Darunter ging es noch weiter...


Anmelden zum Antworten