多进程实现并发服务器(TCP)

浪尽此生 提交于 2020-04-07 07:36:35

 前提:基于Linux系统的学习

/*多进程实现并发服务器
父进程任务
  1.从未决连接队列中取出请求,建立和客户端的连接,cfd
  2.创建子进程
  3.close(cfd)
  4.负责子进程的收尸工作

子进程的任务
  1.close(sfd)
  2.子进程负责处理客户端消息
  close(sfd)
  exit(0)
*/
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
//信号自定义函数,来处理回收子进程资源
void doit(){
    wait(NULL);
    return;
} 

int main(){
    char buf[128];
    char IP[128];
    char*msg="hector pro_bf_serv\n";
    struct sockaddr_in serv;
    struct sockaddr_in clie;
    socklen_t clie_len;
    signal(SIGCHLD,doit); 
    //创建socket通讯端口,sfd
    int sfd=socket(AF_INET,SOCK_STREAM,0);
    if(sfd==-1){
        perror("socket");
        return 0;
    }
    //初始化serv的成员
    serv.sin_family=AF_INET;
    serv.sin_port=htons(7007);
    serv.sin_addr.s_addr=htonl(INADDR_ANY);
    //将sfd绑定到服务器
    int b=bind(sfd,(struct sockaddr*)&serv,sizeof(serv));
    if(b==-1){
        perror("bind");
        return -1;
    }
    //将sfd设置为被动监听状态
    listen(sfd,5);
    while(1){
        clie_len=sizeof(clie);
        //建立和客户端的连接
        int cfd=accept(sfd,(struct sockaddr*)&clie,&clie_len);
        if(sfd==-1){
            perror("accept");
            return -1;
        }
        printf("%s\n",inet_ntop(AF_INET,&clie.sin_addr,IP,128));
        pid_t pid=fork();
        if(pid==-1){
            perror("fork");
            return -1;
        }
        if(pid==0){//子进程
            close(sfd);
            int r=read(cfd,buf,128);
            write(1,buf,r);
            write(cfd,msg,strlen(msg));
            close(cfd);
            exit(0);
        }
        else{//父进程
            close(cfd);
        }
    }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!