void * function (void * arg) { struct ARG *info ; info = (struct ARG*)arg; process_cli(info->connfd,info->caddr); free(arg); pthread_exit(NULL); }
void *start_routine(void *arg) { pthread_once(&key_once, processCli_once); struct ARG *info; info = (struct ARG *)arg; process_cli(info->connfd, info->client); free(arg); pthread_exit(NULL); }
int start_engine(t_sh *shell) { while (42) { shell->stdin_buf = get_line(shell); if (process_cli(shell) == 1) return (1); if (shell->close_program == 1) return (0); } }
void* start_routine(void* arg) { ARG *info; info = (ARG *)arg; /* 处理客户请求 */ process_cli(info->connfd, info->client); delete info; pthread_exit(NULL); }
int main(void) { int lfd, cfd; struct sockaddr_in serv_addr,clin_addr; socklen_t clin_len; pid_t pid; char buf[1024]; int len; if((lfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ perror("create socket failed"); exit(1); } int opt = 1; setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(SERV_PORT); if(bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) { perror("bind error"); exit(1); } if(listen(lfd, 128) == -1) { perror("listen error"); exit(1); } clin_len = sizeof(clin_addr); signal(SIGCLD,SIG_IGN); while(1) { if((cfd = accept(lfd, (struct sockaddr *)&clin_addr, &clin_len)) == -1) { perror("accept error"); exit(1); } pid = fork(); if (pid > 0) { // 在父进程中关闭连接的套接字描述符,只是把 cfd 的引用数减少1,在子进程中还在使用 cfd close(cfd); } else if (pid == 0) { // 子进程关闭 lfd 处理任务,使其回到 TIME_WAIT 状态值 close(lfd); process_cli(cfd,clin_addr); exit(0); } else { perror("fork error"); exit(1); } } close(lfd); return 0; }
main() { int listenfd, connectfd; /* socket descriptors */ pid_t pid; struct sockaddr_in server; /* server's address information */ struct sockaddr_in client; /* client's address information */ int sin_size; /* Create TCP socket */ if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* handle exception */ perror("Creating socket failed."); exit(1); } int opt = SO_REUSEADDR; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr = htonl (INADDR_ANY); if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { /* handle exception */ perror("Bind error."); exit(1); } if(listen(listenfd,BACKLOG) == -1){ /* calls listen() */ perror("listen() error\n"); exit(1); } sin_size=sizeof(struct sockaddr_in); while(1) { /*accept connection */ if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) { perror("accept() error\n"); exit(1); } /* Create child process to service client */ if ((pid=fork())>0) { /* parent process */ close(connectfd); continue; } else if (pid==0) { /*child process*/ close(listenfd); process_cli(connectfd, client); exit(0); } else { printf("fork error\n"); exit(0); } } close(listenfd); /* close listenfd */ }
int main() { int listenfd,connectfd; pid_t pid; struct sockaddr_in server; struct sockaddr_in client; int sin_size; if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket() error"); exit(1); } bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { perror("bind() error"); exit(1); } if(listen(listenfd,BACKLOG)==-1) { perror("listen() error"); exit(1); } sin_size=sizeof(struct sockaddr_in); while(1) { sin_size=sizeof(struct sockaddr_in); if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) { perror("accept() error"); exit(1); } if((pid=fork())<0) { printf("fork error\n"); exit(1); } else if(pid==0) { close(listenfd); process_cli(connectfd,client); exit(0); } else { close(connectfd); continue; } } close(listenfd); }
main() { int i, maxi, maxfd,sockfd; int nready; ssize_t n; fd_set rset, allset; int listenfd, connectfd; /* socket descriptors */ struct sockaddr_in server; /* server's address information */ /* client's information */ CLIENT client[FD_SETSIZE]; char recvbuf[MAXDATASIZE]; int sin_size; /* Create TCP socket */ if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* handle exception */ perror("Creating socket failed."); exit(1); } int opt = SO_REUSEADDR; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr = htonl (INADDR_ANY); if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { /* handle exception */ perror("Bind error."); exit(1); } if(listen(listenfd,BACKLOG) == -1){ /* calls listen() */ perror("listen() error\n"); exit(1); } sin_size=sizeof(struct sockaddr_in); /*initialize for select */ maxfd = listenfd; maxi = -1; for (i = 0; i < FD_SETSIZE; i++) { client[i].fd = -1; } FD_ZERO(&allset); FD_SET(listenfd, &allset); while(1) { struct sockaddr_in addr; rset = allset; nready = select(maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) { /* new client connection */ /* Accept connection */ if ((connectfd = accept(listenfd,(struct sockaddr *)&addr,&sin_size))==-1) { perror("accept() error\n"); continue; } /* Put new fd to client */ for (i = 0; i < FD_SETSIZE; i++) if (client[i].fd < 0) { client[i].fd = connectfd; /* save descriptor */ client[i].name = new char[MAXDATASIZE]; client[i].addr = addr; client[i].data = new char[MAXDATASIZE]; client[i].name[0] = '\0'; client[i].data[0] = '\0'; printf("You got a connection from %s. ",inet_ntoa(client[i].addr.sin_addr) ); break; } if (i == FD_SETSIZE) printf("too many clients\n"); FD_SET(connectfd, &allset); /* add new descriptor to set */ if (connectfd > maxfd) maxfd = connectfd; if (i > maxi) maxi = i; if (--nready <= 0) continue; /* no more readable descriptors */ } for (i = 0; i <= maxi; i++) { /* check all clients for data */ if ( (sockfd = client[i].fd) < 0) continue; if (FD_ISSET(sockfd, &rset)) { if ( (n = recv(sockfd, recvbuf, MAXDATASIZE,0)) == 0) { /*connection closed by client */ close(sockfd); printf("Client( %s ) closed connection. User's data: %s\n",client[i].name,client[i].data); FD_CLR(sockfd, &allset); client[i].fd = -1; delete client[i].name; delete client[i].data; } else process_cli(&client[i], recvbuf, n); if (--nready <= 0) break; /* no more readable descriptors */ } } } close(listenfd); /* close listenfd */ }