#include #include #include #include #include #include #include #include #include #include void sig_chld(int signo) { pid_t pid; int stat; while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) printf("child %d terminated.\n", pid); return ; } #define MAXCONN 3 int main(int argc, char * argv[]) { int sockfd, rec_sock, len, i; struct sockaddr_in addr, recaddr; struct sigaction abc; int client[MAXCONN]; char buf[100]; fd_set allset, rset; int maxfd; abc.sa_handler = sig_chld; sigemptyset(&abc.sa_mask); abc.sa_flags = 0; sigaction(SIGCHLD, &abc, NULL); if (argc < 2) { printf("Usage: a.out port.\n"); exit(0); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror(": Can't get socket"); exit(1); } addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = htons((short)atoi(argv[1])); if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror(": bind"); exit(1); } len = sizeof(addr); if (getsockname(sockfd, (struct sockaddr *)&addr, &len) < 0) { perror(": can't get name"); _exit(1); } printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), addr.sin_port); if (listen(sockfd, 5) < 0) { perror(": bind"); exit(1); } for (i=0; i maxfd) maxfd = rec_sock; } for (i=0; i