多進程實現並發服務器(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\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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM