前提: 基于 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;
- }
来源: http://www.bubuko.com/infodetail-2695825.html