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

Posted 秋雨丶梧桐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程实现并发服务器(TCP)相关的知识,希望对你有一定的参考价值。

 前提:基于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 "; 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 ",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; }

 


以上是关于多进程实现并发服务器(TCP)的主要内容,如果未能解决你的问题,请参考以下文章

进程对象的其他方法守护进程使用多进程实现 socket tcp协议 server端的并发(抢票程序)队列进程之间的通信(IPC)

并发编程

第十七节 单进程单线程非堵塞实现并发验证

Linux下的TCP/IP编程----进程及多进程服务端

TCP编程:多进程(fork)并发处理客户端请求

进程队列补充socket实现服务器并发线程完结