Recvudp

From Ggl's wiki

Jump to: navigation, search
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
        int s;
        struct sockaddr_in addr, from;
        int optval = 1;
        unsigned int fromlen, n;
        unsigned char buf[65535];

        if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                perror("Opening socket");
                exit(1);
        }
    
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(0x1337);

        if (setsockopt (s, SOL_SOCKET, SO_BROADCAST, (caddr_t) &optval, sizeof (optval)) < 0) {
                perror("setsockopt()");
                goto fail;
        }

        if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (caddr_t) &optval, sizeof (optval)) < 0) {
                perror("setsockopt()");
                goto fail;
        }

        if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
                perror("bind()");
                goto fail;
        }

        while (1) {
                fromlen = sizeof(from);
                if ((n = recvfrom(s, buf, 1024, 0, (struct sockaddr *) &from, &fromlen)) < 0) {
                        perror("recvfrom()");
                        goto fail;
                }
                buf[n] = 0;
                if ((buf[0] == 0xde) && (buf[1] == 0xad) && (n == 1001))
                        fprintf(stderr, "Msg from %s: %s\n", inet_ntoa(from.sin_addr), buf + 2);
        }

        return 0;

fail:
        close(s);
        exit(1);
}
Personal tools