多进程多线程服务器编写

来源:互联网 发布:优化关键词技巧 编辑:程序博客网 时间:2024/06/15 14:33

多线程

int main(int argc,char* argv[]){    if(argc!=3)    {        printf("Usage:%s [service ip][service port]\n",argv[0]);        return 1;    }    int sock=socket(AF_INET,SOCK_STREAM,0);    //create ipv4 socket     struct sockaddr_in server_socket;    struct sockaddr_in client_socket;    bzero(&server_socket,sizeof(server_socket));    //fill addr port    server_socket.sin_family=AF_INET;    server_socket.sin_addr.s_addr=inet_addr(argv[1]);    server_socket.sin_port=htons(atoi(argv[2]));    if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)    {        perror("bind");        close(sock);        return 1;     }    if(listen(sock,10)<0)    {        printf("listen error ,error code is %d,error string is :%s\n",errno,strerror(errno));        close(sock);        return 2;    }    printf("bind and listen sucess,wait accept..\n");    for(;;)    {        socklen_t len=sizeof(client_socket);        //int client_sock=accept(sock,(struct sockaddr*)&client_socket,&len);   //return fd        int new_sock=accept(sock,(struct sockaddr*)&client_socket,&len);   //return fd        if(new_sock<0)        {            //perror("accept ");            continue;        }        printf("get new client!,[%s:%d]\n",\                inet_ntoa(client_socket.sin_addr)\                ,ntohs(client_socket.sin_port));        char buf[1024];        pid_t id=fork();//创建子进程        if(id<0)        {            //perror("fork");            close(new_sock);            continue;        }        else if(id==0)        {//chilld            if(fork()>0)            {                exit(0);            }            close(sock);            //...            //provide service            //read &write        while(1)        {            ssize_t s=read(new_sock,buf,sizeof(buf));            if(s>0)            {                buf[s]=0;                printf("Client #:%s\n",buf);                write(new_sock,buf,strlen(buf));            }else if(s==0)            {                printf("client quit!\n");                break;            }            else             {                perror("read");            }        }        }        else        {//father            waitpid(id,NULL,0);            close(new_sock);        }        close(new_sock);    }    return 0;}

多线程

/*************************************************************************    > File Name: service.c    > Author: steve_abelieve    > Mail: caoliang2025@foxmail.com     > Created Time: Wed 26 Jul 2017 02:03:25 AM PDT ************************************************************************/#include<sys/socket.h>#include<sys/types.h>#include<stdio.h>#include<arpa/inet.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<pthread.h>//multipthreadvoid* request(void* argc){    //server  : read&write    int new_sock=(int)argc;        char buf[1024];        while(1)        {        ssize_t s=read(new_sock,buf,sizeof(buf));        if(s>0)        {            buf[s]=0;            printf("Client #:%s\n",buf);            write(new_sock,buf,strlen(buf));        }else if(s==0)        {            printf("client quit!\n");        }else        {            perror("read");        }        }        close(new_sock);}int main(int argc,char* argv[]){    if(argc!=3)    {        printf("Usage:%s [service ip][service port]\n",argv[0]);        return 1;    }    int sock=socket(AF_INET,SOCK_STREAM,0);    //create ipv4 socket     struct sockaddr_in server_socket;    struct sockaddr_in client_socket;    bzero(&server_socket,sizeof(server_socket));//fill addr port    server_socket.sin_family=AF_INET;    server_socket.sin_addr.s_addr=inet_addr(argv[1]);    server_socket.sin_port=htons(atoi(argv[2]));    if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)    {        perror("bind");        close(sock);        return 1;     }    if(listen(sock,10)<0)    {        printf("listen error ,error code is %d,error string is :%s\n",errno,strerror(errno));        close(sock);        return 2;    }    printf("bind and listen sucess,wait accept..\n");    while(1)    {        socklen_t len=sizeof(client_socket);        int new_sock=accept(sock,(struct sockaddr*)&client_socket,&len);        if(new_sock<0)        {            perror("accept");            continue;        }        printf("get new client![%s:%d]\n",\                inet_ntoa(client_socket.sin_addr)\                ,ntohs(client_socket.sin_port));        pthread_t pid;        //pthread_create(&pid,NULL,request,(void*)client_socket.sin_addr);        pthread_create(&pid,NULL,request,(void*)new_sock);        //detach            pthread_detach(pid);  //线程分离,防止一个线程出现错误,导致整个进程终止    }    close(sock);return 0;}
原创粉丝点击