#include #include #include #include #include main(argc, argv) int argc; char *argv[]; { int s; int i; int on = 1; int port = 1234; int bufsize = 512; int eof = 0; char *buf; char *hostname = ""; struct hostent *host; struct sockaddr_in sin; while (++argv, --argc) { if ((*argv)[0] == '-') switch ((*argv)[1]) { case 'e': eof++; break; case 'b': if ((++argv, --argc) && (i = atoi(*argv))) bufsize = i; else { fprintf(stderr, "%s: bad bufsize\n", argc ? *argv : "???"); exit(1); } break; case 'h': if ((++argv, --argc)) hostname = *argv; else { fprintf(stderr, "No hostname!\n"); exit(1); } break; default: fprintf(stderr, "%s: bad switch\n", *argv); exit(1); } else { if (i = atoi(*argv)) port = i; else { fprintf(stderr, "%s: bad port\n", *argv); exit(1); } } } s = socket(AF_INET, SOCK_DGRAM, 0); sin.sin_family = AF_INET; if ((*hostname != '\0') && (host = (struct hostent *)gethostbyname(hostname))) { bcopy(host->h_addr, (caddr_t)&sin.sin_addr, host->h_length); } else { if (*hostname != '\0') { sin.sin_addr.s_addr = inet_addr(hostname); if (sin.sin_addr.s_addr == -1) { fprintf(stderr, "%s: bad hostname\n", hostname); exit(1); } } else { sin.sin_addr.s_addr = htonl(0x8008ffff); /* UMDnet broadcast! XXX */ if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) { perror("setsockopt"); exit(1); } } } sin.sin_port = htons(port); /* if (bind(s, &sin, sizeof(struct sockaddr_in)) < 0) { perror("bind"); exit(1); } */ buf = (char *)malloc(bufsize); while ((i = read(0, buf, bufsize)) > 0) { if (sendto(s, buf, i, 0, &sin, sizeof(struct sockaddr_in)) != i) { perror("sendto"); exit(1); } } if (eof) if(sendto(s, buf, 0, 0, &sin, sizeof(struct sockaddr_in)) < 0) { perror("eof sendto"); exit(1); } }