TCP并发服务器多进程
创始人
2024-12-15 16:06:03

 service

#include #include  #include  #include   #include #include #include #include  #include  #include  #include #define PORT 5001 #define STR_QUIT "quit" void child_data_handle(int signum) {         if(SIGCHLD == signum)         {                 waitpid(-1,NULL,WNOHANG);         }  } void* client_data_handle(void* arg);  int main() {          int fd = -1;         int newfd = -1;         pid_t pid;          signal(SIGCHLD,child_data_handle);          fd = socket(AF_INET,SOCK_STREAM,0);         if(fd<0)         {                 perror("socket");                 exit(1);         }          struct sockaddr_in sin;         bzero(&sin,sizeof(sin));         sin.sin_family = AF_INET;         sin.sin_port = htons(PORT);         sin.sin_addr.s_addr = INADDR_ANY;          if(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0)         {                 perror("bind");                 exit(1);          }          if(listen(fd,5)<0)         {                 perror("listen");                 exit(1);         }         pid_t pid;          int newfd = -1;         struct sockaddr_in cin;         bzero(&sin,sizeof(cin));         socklen_t sockaddr_len = sizeof(cin);          while(1)         {                 newfd = accept(fd,(struct sockaddr *)&cin.sin_addr,&sockaddr_len);                         if(newfd<0)                         {                                 perror("accept");                                 exit(1);                         }                  pid = fork();                  if(pid<0)                 {                         perror("fork");                         exit(1);                 }                 if(pid == 0)                 {                          char ipv4[16];                          if(!inet_ntop(newfd,(void *)&cin.sin_addr,ipv4,sizeof(cin)))                         {                                 perror("inet_ntop");                                 exit(1);                         }                         printf("client (%s,%d) is connect\n",ipv4,ntohs(cin.sin_port));                           client_data_handle(&newfd);                         close(fd);                 }                  if(pid>0)                  {                         close(newfd);                 }          }         close(fd);         return 0; }  void* client_data_handle (void* arg)  {         char buf[1024];         int newfd = *(int*)arg;         int ret =-1;         printf("child handle process:newfd = %d\n",newfd);         while(1)         {                  do{                         ret = read(newfd,&buf,1023);                   }while(ret<1);                  if(!ret)                 {                         break;                 }                 if(ret<0)                 {                         exit(1);                 }                  printf("receive data is %s\n",buf);                 if(!strncasecmp(buf,STR_QUIT,strlen(STR_QUIT)))                 {                         printf("client is exiting!");                         break;                 }         }  }  

client

#include #include  #include  #include  /* superset of previous */ #include #include  #include  #include   #include  #include  #include   #include           /* See NOTES */ #include  //./client 192.168.182.144 5001     #define SERV_PORT 5001 #define SERV_IP_ADDR "192.168.157.34" #define BUFSIZE 1024 #define QUIT_STR "QUIT"   int main(int argc,char **argv) {         int fd = -1;         if(argc!=3)         {         exit(1);         }         int port = -1;         port = atoi(argv[2]);         fd = socket(AF_INET,SOCK_STREAM,0);         if(fd<0)         {                  perror("socket");                 exit(1);         }          struct sockaddr_in sin;       bzero(&sin,sizeof(sin));         sin.sin_family = AF_INET;         sin.sin_port = htons(port);         sin.sin_addr.s_addr = inet_addr(argv[1]);          if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))<0)         {                 perror("connect");                 exit(1);         }         char buf[BUFSIZE];         while(1)         {                 bzero(buf,BUFSIZE);                 if(fgets(buf,BUFSIZE-1,stdin)==NULL)                 {                         continue;                 }                write(fd,buf,strlen(buf));                 if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))                 {                          break;                 }           }         return 0;   } 

结果

 

相关内容

热门资讯

上海移动宣布5G-A超级上行网... 来源:滚动播报 (来源:上观新闻) 采访对象提供 5月17日,“智能加码 科创申城” 中国移动上海...
英伟达CEO黄仁勋痛斥将GPU... IT之家 5 月 17 日消息,英伟达首席执行官黄仁勋受邀担任斯坦福大学《前沿系统》CS 153 课...
2026年高性价比机型封神榜:... 2026 年手机市场机型繁杂,多数用户都面临相同的选购困境:千元预算想选高性价比手机,怕续航拉垮、用...
江苏辛巴新材料取得零碳风光互补... 国家知识产权局信息显示,江苏辛巴新材料科技股份有限公司取得一项名为“一种零碳风光互补装置”的专利,授...
全钢实验台厂家梳理 医疗/科研... 导语:实验室设备选型需兼顾功能适配性与长期稳定性。基于2026年实验室建设行业白皮书及公开市场数据,...