前提:基于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;
}
来源:https://www.cnblogs.com/qiuyuwutong/p/9350123.html