文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>客户/服务器程序设计范式(8)--并发服务器程序,每..

客户/服务器程序设计范式(8)--并发服务器程序,每..

时间:2010-05-17  来源:marksman201

每个客户一个线程的方式和一个客户一个进程的方式比较相似,其核心步骤大体如下:
    for ( ; ; ) {
        connfd = Accept(listenfd, cliaddr, &clilen);

        Pthread_create(&tid, NULL, &doit, (void *) connfd);
    }
可以将accept返回的连接套接字作为参数传递给线程函数。

这部分代码也比较简单:
serv06.c
-----------------------------

/* include serv06 */
#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);
}
/* end serv06 */

void
sig_int(int signo)
{
    void pr_cpu_time(void);

    pr_cpu_time();
    exit(0);
}


doit函数先让自己脱离,使得主线程不必等待它,然后调用web_child函数。

这种为每个客户创建一个线程的方式比为每个客户创建一个进程的方式要快很多:

$ ./serv06 173.26.100.162 12345

user time = 0.012, sys time = 0.128008

源代码包见<<客户/服务器程序设计范式---迭代服务器程序>>后附件

相关阅读 更多 +
排行榜 更多 +
斗虫公园手机版下载

斗虫公园手机版下载

休闲益智 下载
武林外传之同福奇缘手机版下载

武林外传之同福奇缘手机版下载

角色扮演 下载
无畏契约源能行动小米服手游下载

无畏契约源能行动小米服手游下载

飞行射击 下载