tcp 回射服務器 多線程版

文件名: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章