美文网首页
Linux多进程服务器和多线程服务器

Linux多进程服务器和多线程服务器

作者: FakeCSer爱去网吧 | 来源:发表于2020-03-08 10:21 被阅读0次

    多进程

    #include <unistd.h>
    
    #include <sys/types.h>
    #include <sys/socket.h>
    
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <signal.h>
    #include <sys/wait.h>
    #include <iostream>
    using namespace std;
    
    #include <cstring>
    #include <ctype.h>
    #define SERVER_PORT 8888
    
    void Mywait(int signum)
    {
        while(waitpid(0,NULL,WNOHANG)>0);
        return;
    } 
    
    int main()
    {
        int listenfd,connectfd;
        char buf[BUFSIZ],clientip[BUFSIZ];
        struct sockaddr_in serveraddr,clientaddr;
        int n,i,ret;
        socklen_t addrlen;  
        pid_t pid;
        listenfd = socket(AF_INET,SOCK_STREAM,0);
        if(listenfd == -1)
        {
            perror("socket");
            exit(1);
        }
    
        bzero(&serveraddr,sizeof(serveraddr));  
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_port = htons(SERVER_PORT);
        serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
        ret = bind(listenfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
        if(ret == -1)
        {
            perror("bind");
            exit(1);    
        }
        ret = listen(listenfd,128);
        if(ret == -1)
        {
            perror("lisetn");
            exit(1);
        }
        while(1)
        {//父进程阻塞建立连接
            addrlen = sizeof(clientaddr);
            connectfd = accept(listenfd,(struct sockaddr*)&clientaddr,&addrlen);
            if(connectfd == -1)
            {
                perror("accept");
                exit(1);
            }
            printf("client ip is %s,port is %d\n",
                inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,clientip,sizeof(clientip)),
                ntohs(clientaddr.sin_port));
            pid = fork();
            if(pid ==-1 )
            {
                perror("fork");
                exit(1);    
            }
            else if(pid ==0)
            {//son:operate
                close(listenfd);
                break;
    
            }
            else
            {
                close(connectfd);
                signal(SIGCHLD,Mywait);
            }
        }
        if(pid == 0)
        {//子进程处理
            while(1)
            {
                n = read(connectfd,buf,sizeof(buf));
                if(n >0)
                {
                    for(i=0;i<n;i++)
                    {
                        buf[i] = toupper(buf[i]);
                    } 
                    write(connectfd,buf,n);//not sizeof
                }   
                else if(n == 0)
                {
                    close(connectfd);
                    exit(0);    
                }
                else if(n==-1)
                {
                    perror("read");
                }
            }
    
        }
    }
    
    

    多线程

    #include <unistd.h>
    #include <pthread.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <iostream>
    using namespace std;
    #include <arpa/inet.h>//sockaddr_in
    #include <netinet/in.h>
    #include <cstring>
    #define SERVER_PORT 8888
    
    int lfd,cfd;
    struct sockaddr_in serveraddr,clientaddr;
    char buf[BUFSIZ];
    socklen_t addrlen;
    pthread_t tid;
    int ret,n,i;
    
    void *thr_fun(void * arg)
    {
        ret = pthread_detach(pthread_self());
        if(ret == -1)
        {
            perror("datach");
            exit(1);
        }
        while(1)
        {
            n = read(cfd,buf,sizeof(buf));
            if(n>0){
                for(i=0;i<n;i++)
                {
                    buf[i] = toupper(buf[i]);
                }
                write(cfd,buf,n);
            }else if(n==0){
                break;  
            }else{
                perror("read");
                exit(1);
            }
        }
    
        close(cfd);
    
    }
    
    
    int main()
    {
    
        lfd = socket(AF_INET,SOCK_STREAM,0);
        if(ret == -1){
            perror("socket");
            exit(1);
        }   
    
        bzero(&serveraddr,sizeof(serveraddr));
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_port = htons(SERVER_PORT);
        serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
        ret = bind(lfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
        if(ret == -1){
            perror("bind");
            exit(1);
        }
    
        ret = listen(lfd,128);
        if(ret == -1){
            perror("listen");
            exit(1);
        }
    
    
        while(1)
        {
            addrlen = sizeof(clientaddr);       
            cfd = accept(lfd,(struct sockaddr*)&clientaddr,&addrlen);
            if(cfd == -1){
                perror("accept");
                exit(1);
            }
    
            ret = pthread_create(&tid,NULL,thr_fun,NULL);
            if(ret != 0)
            {
                perror("pthread create");
                exit(1);
            }
        }
    
        close(lfd);
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:Linux多进程服务器和多线程服务器

          本文链接:https://www.haomeiwen.com/subject/butddhtx.html