void catch_child(int signum)
{
while(waitpid(0,NULL,WNOHANG) > 0);
return ;
}
int main(int argc,char *argv[])
{
int lfd = 0,cfd = 0;
pid_t pid;
int ret;
char buf[BUFSIZ];//4096
struct sockaddr_in serv_addr,clit_addr;
socklen_t clit_addr_len;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PROT);//SERV_PROT 9527
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
lfd = socket(AF_INET,SOCK_STREAM,0);
bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
listen(lfd,128);
clit_addr_len = sizeof(clit_addr);
while(1){
cfd = accept(lfd,(struct sockaddr *)&clit_addr,&clit_addr_len);
pid = fork();
if(pid < 0){
perr_exit("fork error");
}else if(pid == 0){
//子进程
close(lfd);
break;
}else{
struct sigaction act;
act.sa_handler = catch_child;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
ret = sigation(SIGCHLD,&act,NULL);
if(ret != 0){
//error
}
close(cfd);
continue;
}
}
if(pid == 0){
for(;;){
ret = read(cfd,buf,sizeof(buf));
if(ret == 0){
close(cfd);
exit(1);
}
//处理数据,转换成大写字母
for(int i = 0;i < ret;i++)
buf[i] = toupper(buf[i]);
//
write(cfd,buf,ret);
}
}
return 0;
}
Linux网络编程——多进程并发服务器实现
猜你喜欢
转载自blog.csdn.net/Strive_LiJiaLe/article/details/128714223
今日推荐
周排行