TCP并发服务器(五)——每个客户一个线程
TCP并发服务器(五)——每个客户一个线程
1.说明
前面4个版本都是关于进程的,可以将进程改为线程来实现。
这个最简单的版本也快于前面的所有预先派生进程的版本。
2.代码
#include "unpthread.h"
void sig_int(int signo)
{
DPRINTF("sig_int()\n");
void pr_cpu_time(void);
pr_cpu_time();
exit(0);
}
void *doit(void *arg)
{
void web_child(int);
DPRINTF("创建一个线程\n");
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\n");
int connfd = Accept(listenfd, cliaddr, &clilen);
DPRINTF("Accept a connection\n");
Pthread_create(&tid, NULL, &doit, (void*)connfd);
}
return 0;
}