TCP并发服务器(五)——每个客户一个线程

TCP并发服务器(五)——每个客户一个线程

1.说明

前面4个版本都是关于进程的,可以将进程改为线程来实现。

这个最简单的版本也快于前面的所有预先派生进程的版本。

 

2.代码

#include "unpthread.h"

void sig_int(int signo)
{
    DPRINTF("sig_int()
");
    void pr_cpu_time(void);
    pr_cpu_time();
    exit(0);
}

void *doit(void *arg)
{
    void web_child(int);
    DPRINTF("创建一个线程
");
    Pthread_detach(pthread_self());
    
    //int connfd = (int)arg;
    web_child((int)arg);
    Close((int)arg);

    return NULL;
}


int main(int argc, char *argv[])
{
    socklen_t addrlen;
    int listenfd;
    if (argc == 2) {
        listenfd = Tcp_listen(NULL, argv[1], &addrlen);
    } else if (argc == 3) {
        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
    } else {
        err_sys("Usage: a.out [ <host> ] <port#>");
    }
    struct sockaddr *cliaddr = (struct sockaddr*)Malloc(addrlen);

    Signal(SIGINT, sig_int);

    pthread_t tid;
    for (;;) {
        socklen_t clilen = addrlen;
        DPRINTF("Wait for a connection
");
        int connfd = Accept(listenfd, cliaddr, &clilen);
        DPRINTF("Accept a connection
");

        Pthread_create(&tid, NULL, &doit, (void*)connfd);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/hancm/p/3866604.html