文件名:pthread_server.cpp
作用:使用多線程版本的tcp回射服務器
#include <sys/socket.h>
#include <strings.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "common.h"
#include <unistd.h>
#include<signal.h>
#include<wait.h>
#include <pthread.h>
void
str_echo(int sockfd)
{
ssize_t n;
char buf[4096];
again:
while((n = read(sockfd, buf, 4096)) > 0)
writen(sockfd, buf, n);
if(n < 0 && errno == EINTR)
goto again;
else if(n < 0)
{
perror("read");
exit(1);
}
}
static void *doit(void *);
int main(int argc,char **argv)
{
int listenfd,connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
pthread_t tid;
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9877);
if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0)
{
perror("bind");
exit(1);
}
if(listen(listenfd,5) < 0)
{
perror("listen");
exit(1);
}
for(;;)
{
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen)) < 0)
{
printf("accept failed\n");
exit(1);
}
pthread_create(&tid,NULL,&doit,(void *) connfd);
}
}
static void *doit(void *arg)
{
int *connfd = (int*)arg;
pthread_detach(pthread_self());
str_echo(*connfd);
close(*connfd);
return NULL;
}