#include #include static void usage(void) { print("usage: %s mcast-ip port\n", argv0); exits("usage"); } void main(int argc, char **argv) { NetConnInfo *ncinfo; char adir[40], ldir[40], buf[1024]; int fd, acfd, lcfd, dfd, n; ARGBEGIN{ default: usage(); }ARGEND; if(argc != 2) usage(); fd = dial(netmkaddr(argv[0], "udp", argv[1]), 0, 0, 0); ncinfo = getnetconninfo(nil, fd); if(ncinfo == nil) sysfatal("getnetconninfo: %r"); close(fd); acfd = announce(netmkaddr(argv[0], "udp", argv[1]), adir); if(acfd < 0) sysfatal("announce: %r"); if(fprint(acfd, "addmulti %s %s", ncinfo->lsys, argv[0]) < 0) sysfatal("addmulti: %r"); freenetconninfo(ncinfo); for(;;){ lcfd = listen(adir, ldir); if(lcfd < 0) sysfatal("listen: %r"); switch(fork()){ case -1: sysfatal("fork: %r"); case 0: dfd = accept(lcfd, ldir); if(dfd < 0) sysfatal("accept: %r"); if((n = read(dfd, buf, sizeof(buf))) < 0) sysfatal("read: %r"); write(1, buf, n); exits(0); default: close(lcfd); } } }