当前位置: 首页 > news >正文

十八、TCP多线程、多进程并发服务器

1、TCP多线程并发服务器

服务端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
void* cilent_data_handle(void* arg)
{int newfd=*(int *)arg;char buf[bufsize];printf("thread handle:newfd = %d\n",newfd);int ret =-1;while(1){do{bzero(buf,bufsize);ret=read(newfd,buf,bufsize-1);}while(ret<1);if(ret<0){exit(1);}if(!ret){break;}printf("recive data is %s\n",buf);if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilenr is exiting!\n");break;}}close(newfd);}
int main()
{int fd=-1;fd=socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family=AF_INET;sin.sin_port = htons(SERV_IP);sin.sin_addr.s_addr = INADDR_ANY;
/*	if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1){perror("inet_pton");exit(1);}*///2.bindif(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0){perror("bind");exit(1);	   }//3.listenif(listen(fd,5)<0){perror("listen");exit(1);}//4.accepint newfd=-1;pthread_t tid;struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){perror("accept");exit(1);}char IPV4_addr[16];if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin))){perror("inet_ntop");exit(1);}printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));pthread_create(&tid,NULL,cilent_data_handle,(void *)&newfd);}//readreturn 0;
}
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
int main(int arc,void **arg)
{if(arc!=3){exit(1);}int port =-1;port=atoi(arg[2]);int fd=-1;fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){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(arg[1]);if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect");exit(1);}char buf[bufsize];while(1){bzero(buf,strlen(buf));if(fgets(buf,bufsize-1,stdin)==NULL){continue;}write(fd,buf,strlen(buf));if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){break;}}
close(fd);return 0;
}

  代码示例:

2、TCP多进程并发服务器

服务端
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#define QUIT_STR "QUIT"
#define SERV_RESP_STR "SERVER:"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
void child_data_handle(int signum)
{if(SIGCHLD==signum){waitpid(-1,NULL,WNOHANG);}
}
void* cilent_data_handle(void* arg)
{int newfd=*(int *)arg;char buf[bufsize];printf("child process handle:newfd = %d\n",newfd);int ret =-1;while(1){do{bzero(buf,bufsize);ret=read(newfd,buf,bufsize-1);}while(ret<1);if(ret<0){exit(1);}if(!ret){break;}printf("recive data is %s\n",buf);if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilenr is exiting!\n");break;}}close(newfd);}
int main()
{int fd=-1;signal(SIGCHLD,child_data_handle);fd=socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family=AF_INET;sin.sin_port = htons(SERV_IP);sin.sin_addr.s_addr = INADDR_ANY;
/*	if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1){perror("inet_pton");exit(1);}*///2.bindif(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0){perror("bind");exit(1);	   }//3.listenif(listen(fd,5)<0){perror("listen");exit(1);}//4.accepint newfd=-1;pthread_t tid;pid_t pid;struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){perror("accept");exit(1);}pid = fork();if(pid<0){perror("fork");break;}if(pid == 0){char IPV4_addr[16];if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin))){perror("inet_ntop");exit(1);}printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));cilent_data_handle(&newfd);close(fd);}if(pid >0){close(newfd);}}//readreturn 0;
}
​
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128" 
#define bufsize 1024
int main(int arc,void **arg)
{if(arc!=3){exit(1);}int port =-1;port=atoi(arg[2]);int fd=-1;fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){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(arg[1]);if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect");exit(1);}char buf[bufsize];while(1){bzero(buf,strlen(buf));if(fgets(buf,bufsize-1,stdin)==NULL){continue;}write(fd,buf,strlen(buf));if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){break;}}
close(fd);return 0;
}​

 运行结果:


http://www.mrgr.cn/news/98701.html

相关文章:

  • Tomcat与Servlet
  • vmcore分析锁问题实例(x86-64)
  • 面试经历---某能源公司
  • vue动态组件实现动态表单的方法
  • 从标准九九表打印解读单行表达式的书写修炼(Python)
  • 05-DevOps-Jenkins自动拉取构建代码
  • Rust : 关于*const () 与type erase
  • ReportLab 导出 PDF(图文表格)
  • 21天Python计划:零障碍学语法(更新完毕)
  • OSPF综合实验
  • Oracle 中的 NOAUDIT CREATE SESSION 命令详解
  • 双指针算法(一)
  • GR00T N1:面向通用类人机器人的开放基础模型
  • 一天时间,我用AI(deepseek)做了一个配色网站
  • Leetcode 325. 和等于 k 的最长子数组长度【Plus题】
  • PyTorch - Tensor 学习笔记
  • 【前端】Vue一本通 ESLint JSX
  • Vue3+Vite+TypeScript+Element Plus开发-17.Tags-组件构建
  • 解决Flutter 2.10.5在升级Xcode 16后的各种报错
  • Maven 多仓库与镜像配置全攻略:从原理到企业级实践