zoukankan      html  css  js  c++  java
  • UNIX网络编程——客户/服务器程序设计示范(六)

           TCP并发服务器程序,每个客户一个线程

       

              前面讲述了,每个客户一个进程的服务器,或为每个客户现场fork一个子进程,或者预先派生一定数目的子进程。如果服务器主机支持线程,我们就可以改用线程以取代子进程。

    #include	"unpthread.h"
    
    int
    main(int argc, char **argv)
    {
    	int				listenfd, connfd;
    	void			sig_int(int);
    	void			*doit(void *);
    	pthread_t		tid;
    	socklen_t		clilen, addrlen;
    	struct sockaddr	*cliaddr;
    
    	if (argc == 2)
    		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
    	else if (argc == 3)
    		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
    	else
    		err_quit("usage: serv06 [ <host> ] <port#>");
    	cliaddr = Malloc(addrlen);
    
    	Signal(SIGINT, sig_int);
    
    	for ( ; ; ) {
    		clilen = addrlen;
    		connfd = Accept(listenfd, cliaddr, &clilen);
    
    		Pthread_create(&tid, NULL, &doit, (void *) connfd);
    	}
    }
    
    void *
    doit(void *arg)
    {
    	void	web_child(int);
    
    	Pthread_detach(pthread_self());
    	web_child((int) arg);
    	Close((int) arg);
    	return(NULL);
    }
    void
    sig_int(int signo)
    {
    	void	pr_cpu_time(void);
    
    	pr_cpu_time();
    	exit(0);
    }
    

    主线程循环
    23-28    主线程大部分时间阻塞在一个accept调用之中,每当它返回一个客户连接时,就调用pthread_create创建一个新的线程。新线程执行的函数时doit,其参数是所返回的已连接套接字。


    每个线程的函数
    31-40    doit函数先让自己脱离,使得主线程不必等待它,然后调用web_client函数,该函数返回后关闭已连接套接字。


  • 相关阅读:
    hdu 3342 Legal or Not 拓排序
    hdu 1596 find the safest road Dijkstra
    hdu 1874 畅通工程续 Dijkstra
    poj 2676 sudoku dfs
    poj 2251 BFS
    poj Prime Path BFS
    poj 3278 BFS
    poj 2387 Dijkstra 模板
    poj 3083 DFS 和BFS
    poj 1062 昂贵的聘礼 dijkstra
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172535.html
Copyright © 2011-2022 走看看