/* server.c -- server TCP program, adapted from Comer's book */ /* Usage: srv [-d] server port */ #ifndef unix dogshit #define WIN32 #include #include #else #include #include #include #include #include #endif #include #include #define dfprintf if (dbg) fprintf int dbg = 1; #define QLEN 6 /* input queue length */ struct protoent *ptrp; /* protocol table entry */ struct sockaddr_in sad; /* server adr */ struct sockaddr_in cad; /* client adr */ int alen = sizeof(cad); int port = 5194; /* unlikely port */ int visits = 0; main(int argc, char *argv[]) { int i, val, sd, sd2, n; char buf[1000], buf1[1000], host[1000]; /* unchecked */ if (argc > 1 && strcmp(argv[1], "-d") == 0) { dbg = 0; argc--; argv++; } memset((char *) &sad, 0, sizeof(sad)); sad.sin_family = AF_INET; /* internet */ sad.sin_addr.s_addr = INADDR_ANY; /* local IP address */ if (argc > 1) port = atoi(argv[1]); if (port > 0) sad.sin_port = htons((u_short) port); gethostname(host, sizeof(host)); fprintf(stderr, "starting C srv on %s %d\n", host, port); if ((ptrp = getprotobyname("tcp")) == NULL) { fprintf(stderr, "srv: can't map TCP to protocol number\n"); perror(""); exit(1); } if ((sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto)) < 0) { fprintf(stderr, "srv: socket creation failed\n"); perror(""); exit(1); } if (bind(sd, (struct sockaddr *) &sad, sizeof(sad)) < 0) { fprintf(stderr, "srv: bind %d failed\n", port); perror(""); exit(1); } val = 1; setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof(int)); if (listen(sd, QLEN) < 0) { fprintf(stderr, "srv: listen failed\n"); perror(""); exit(1); } while (1) { fprintf(stderr, "srv %s: about to accept\n", host); if ((sd2 = accept(sd, (struct sockaddr *) &cad, &alen)) < 0) { fprintf(stderr, "accept failed\n"); exit(1); } while (1) { for (n = 0; read(sd2, &buf[n], 1) == 1; n++) if (buf[n] == '\n') break; buf[n] = 0; sprintf(buf1, "%s visit %d %s\n", host, ++visits, buf); write(sd2, buf1, strlen(buf1)); if (strcmp(buf, "exit") == 0) break; if (strcmp(buf, "die!") == 0) { close(sd2); close(sd); exit(0); } } close(sd2); /* should this be ? */ } exit(0); }