int main(int argc, char const *argv[]) { int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; struct sigaction act, oact; act.sa_handler = sig_int; act.sa_flags = SA_RESETHAND; listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd == -1) handle_err("socket error"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) handle_err("binding error"); if (listen(listenfd, LISTEN_BACKLOG) == -1) handle_err("listen error"); if (sigaction(SIGINT, &act, &oact) < 0) { handle_err("sigaction error"); } /* call accept, wait for a client */ for ( ; ; ) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); if (connfd == -1) handle_err("accept error"); if (shutdown(connfd, SHUT_RDWR) < 0) handle_err("shutdown error"); if ((childpid = fork()) < 0) handle_err("fork error"); else if (childpid == 0) { /* child process */ close(listenfd); str_write(connfd); /* process the request */ exit(0); } close(connfd); /* parent closes connected socket */ } exit(EXIT_SUCCESS); }
void stop_do(int sockfd, int family) { struct sockaddr client_addr; socklen_t len = (family == AF_INET) ? 16 : 28; for ( ; ;) { int clientfd = Accept(sockfd, &client_addr, &len); print_ip_addr(family, &client_addr, "remote client address:"); bzero(&client_addr, sizeof(client_addr)); pid_t child; if ((child = fork()) < 0) err_sys("fork error"); else if (child == 0) { Close(sockfd); str_write(clientfd); exit(0); } Close(clientfd); } }
void str_repeat(const char *s, int outlen) { printf("void str_repeat(const char *s, int outlen) {\n"); int len = strlen(s) * (1 + WIDTH); outlen += outlen / WIDTH; const char *ss = s; char *buf = malloc(len); int pos = 0; while (pos < len) { printf(" while (pos < len) {\n"); if (!*ss) { printf(" if (!*ss) {\n"); ss = s; } buf[pos++] = *ss++; if (pos >= len) { printf(" if (pos >= len) {\n"); break; } if (pos % (WIDTH + 1) == WIDTH) { printf(" if (pos %% (WIDTH + 1) == WIDTH) {\n"); buf[pos++] = '\n'; } } int fd = fileno(stdout); int l = 0; while (outlen > 0) { printf(" while (outlen > 0) {\n"); l = outlen > len ? len : outlen; wrap_write(fd, buf, l); outlen -= len; } if (buf[l-1] != '\n') { printf(" if (buf[l-1] != '\n') {\n"); str_write("\n"); } free(buf); }