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);
}
Esempio n. 3
0
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);
	}
}
Esempio n. 4
0
	void* start_routine(void* arg)
	{
	ARG *info;
	info = (ARG *)arg;

	/* 处理客户请求 */
	process_cli(info->connfd, info->client);

	delete info;
	pthread_exit(NULL);
	}
Esempio n. 5
0
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;
}
Esempio n. 6
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 */         
	} 
Esempio n. 7
0
 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);  
 }  
Esempio n. 8
0
	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 */         
	}