#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);
}
