LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Embedded & Single-board computer (https://www.linuxquestions.org/questions/linux-embedded-and-single-board-computer-78/)
-   -   UDP Broadcasting problem (https://www.linuxquestions.org/questions/linux-embedded-and-single-board-computer-78/udp-broadcasting-problem-792641/)

xyzt 03-02-2010 09:46 AM

UDP Broadcasting problem
 
Hello
I have an embedded device working on Linux. I try to write a simple code that broadcasts UDP messages. I use this sample code:

Code:

/*
** broadcaster.c -- a datagram "client" like talker.c, except
**                  this one can broadcast
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define SERVERPORT 4950    // the port users will be connecting to

int main(int argc, char *argv[])
{
    int sockfd;
    struct sockaddr_in their_addr; // connector's address information
    struct hostent *he;
    int numbytes;
    int broadcast = 1;
    //char broadcast = '1'; // if that doesn't work, try this

    if (argc != 3) {
        fprintf(stderr,"usage: broadcaster hostname message\n");
        exit(1);
    }

    if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
        perror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    // this call is what allows broadcast packets to be sent:
    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
        sizeof broadcast) == -1) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }

    their_addr.sin_family = AF_INET;    // host byte order
    their_addr.sin_port = htons(SERVERPORT); // short, network byte order
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);

    if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0,
            (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) {
        perror("sendto");
        exit(1);
    }

    printf("sent %d bytes to %s\n", numbytes,
        inet_ntoa(their_addr.sin_addr));

    close(sockfd);

    return 0;
}

http://www.beej.us/guide/bgnet/outpu...html#broadcast

When I deploy the program and run it on the device, I get this error message:

Code:

# ./broadcaster 255.255.255.255 testmsg
/bin/sh: ./broadcaster: Permission denied

But when I run the program on my PC, I don't get any errors.

Altough SO_BROADCAST option is set on the socket, why does it give that error? And what can be the difference between the device and my desktop PC?

Thanks.

Maligree 03-02-2010 01:02 PM

chmod +x broadcaster?

xyzt 03-03-2010 01:48 AM

Quote:

Originally Posted by Maligree (Post 3882940)
chmod +x broadcaster?

Yes, chmod solved that. I've lost while trying to solve it, so I couldn't realize that.
Thanks again.


All times are GMT -5. The time now is 08:56 PM.