#include #include #include #include #include main(argc, argv) int argc; char *argv[]; { int s; int i; int port = 1234; int bufsize = 512; int fromlen; char *buf; char *hostname = ""; struct hostent *host; struct sockaddr_in sin, from; while (++argv, --argc) { if ((*argv)[0] == '-') switch ((*argv)[1]) { 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); } } } if ((*hostname != '\0') && (host = (struct hostent *)gethostbyname(hostname))) { sin.sin_family = host->h_addrtype; bcopy(host->h_addr, (caddr_t)&sin.sin_addr, host->h_length); } else { sin.sin_family = AF_INET; if (*hostname != '\0') { sin.sin_addr.s_addr = htonl(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(INADDR_ANY); } } sin.sin_port = htons(port); s = socket(AF_INET, SOCK_DGRAM, 0); if (bind(s, &sin, sizeof(struct sockaddr_in)) < 0) { perror("bind"); exit(1); } buf = (char *)malloc(bufsize); while ((i = recvfrom(s, buf, bufsize, 0, &from, &fromlen)) > 0) { if (write(1, buf, i) != i) { perror("write"); exit(1); } } if (i < 0) perror("recvfrom"); }