#include #include #include #include #include #include #include /* strdup */ #include /* getopt */ #define PORT (22) #define BACKLOG 20 #ifndef INFTIM #define INFTIM (-1) #endif extern char *optarg; int main(argc, argv) int argc; char *argv[]; { struct pollfd nfd; struct sockaddr_in saddr, caddr; int fd; int c; int clientfd; size_t len; unsigned short port = PORT; bzero(&saddr, sizeof(struct sockaddr_in)); bzero(&caddr, sizeof(struct sockaddr_in)); while ((c = getopt(argc, argv, "h:p:")) != -1) { switch (c) { case 'p': port = atoi(optarg); break; default: break; } } saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = INADDR_ANY; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { printf("socket\n"); exit(1); } if (bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)) < 0) { printf("bind\n"); exit(1); } if (listen(fd, BACKLOG) < 0) { printf("listen\n"); exit(1); } len = sizeof(struct sockaddr_in); if ((clientfd = accept(fd, (struct sockaddr *)&caddr, &len)) < 0) { printf("accept: %s\n", strerror(errno)), exit(1); } printf("accept ok.\n"); /* reset */ nfd.fd = clientfd; nfd.events = 0; nfd.revents = 0; if (poll(&nfd, 1, INFTIM) < 0) printf("poll: %s\n", strerror(errno)), exit(1); if (nfd.revents & POLLERR) printf("poll: POLLERR set\n"); if (nfd.revents & POLLHUP) printf("poll: POLLHUP set\n"); if (nfd.revents & POLLNVAL) printf("poll: POLLNVAL set\n"); /* should not happen */ close(clientfd); printf("sever terminating\n"); exit(0); }