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

2020-03-08  本文已影响0人  FakeCSer爱去网吧

多进程

#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;
}

上一篇下一篇

猜你喜欢

热点阅读