(五十一)高并发服务器——多进程模型
来源:互联网 发布:复刻supreme的淘宝 编辑:程序博客网 时间:2024/04/27 21:06
使用多进程并发服务器时要考虑以下几点:
1.父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)
2.系统内创建进程个数(内存大小相关)
3.进程创建过多是否降低整体服务性能(进程调度)
多进程高并发服务器模型如下(简笔画):
/* service.c */#include <sys/types.h> #include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#define SERVER_PORT 8000#define MAXLINE 4096int main(void){ struct sockaddr_in serveraddr, clientaddr; int sockfd, addrlen, confd, len, i; pid_t pid; char ipstr[128]; char buf[MAXLINE]; //1.构造用于TCP通信的套接字socket 第二个参数就是选择协议类型 sockfd = socket(AF_INET, SOCK_STREAM, 0); //2.bind bzero(&serveraddr, sizeof(serveraddr)); /* 地址族协议IPv4 */ serveraddr.sin_family = AF_INET; /* IP地址 */ serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); serveraddr.sin_port = htons(SERVER_PORT); bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); //3.listen listen(sockfd, 128); while (1) { //4.accept阻塞监听客户端链接请求 addrlen = sizeof(clientaddr); confd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen); //输出客户端IP地址和端口号 inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ipstr, sizeof(ipstr)); printf("client ip %s\tport %d\n", inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ipstr, sizeof(ipstr)), ntohs(clientaddr.sin_port)); /****************** 多进程服务器 ********************/ pid = fork(); if(pid == 0) {//子进程中,处理客户机需求 close(sockfd); //和客户端交互数据操作confd //5.处理客户端请求 while(1) { len = read(confd, buf, sizeof(buf)); i = 0; while (i < len) { buf[i] = toupper(buf[i]); i++; } write(confd, buf, len); } close(confd); return 0; } else if(pid > 0) {//父进程 close(confd); //关闭之后就会继续循环,接收客户机请求 } else { perror("fork"); exit(1); } close(confd); } close(sockfd); return 0;}
/* client.c */#include <netinet/in.h>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>#define SERVER_PORT 8000#define MAXLINE 4096int main(int argc, char *argv[]){ struct sockaddr_in serveraddr; int confd, len; //char ipstr[] = "192.168.6.254"; char buf[MAXLINE]; //1.创建一个socket confd = socket(AF_INET, SOCK_STREAM, 0); //2.初始化服务器地址 bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; //字符串argv[1] inet_pton(AF_INET,"127.0.0.1" , &serveraddr.sin_addr.s_addr); serveraddr.sin_port = htons(SERVER_PORT); //3.链接服务器 connect(confd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); while(fgets(buf, sizeof(buf), stdin)) { //4.请求服务器处理数据 write(confd, buf, strlen(buf)); len = read(confd, buf, sizeof(buf)); write(STDOUT_FILENO, buf, len); } //5.关闭socket close(confd); return 0;}
测试方法就是:
打开四个终端:
1.一个用于运行server程序
2.两个个用于运行client程序(这两个程序都可以输入字符串,并会收到大写的字符串)
3.一个用于观察:
使用命令pa -aux和netstat -apn | grep 8000
3 0
- (五十一)高并发服务器——多进程模型
- (五十二)高并发服务器——多线程模型
- 1高并发服务器:多进程服务器
- 【Unix 网络编程】服务器网络编程模型——多进程并发模型
- 9 多进程并发服务器模型
- (五十三)高并发服务器——多路IO转接机制Select模型
- (五十四)高并发服务器——多路IO转接机制poll模型
- (五十五)高并发服务器——多路IO转接机制epoll模型
- 高性能高并发服务器架构浅析--多进程模式
- Nginx 多进程模型是如何实现高并发的?
- UNIX网络编程——并发服务器(多进程)
- 实现高并发服务器三种简化模型 线程 进程 IO复用
- 《Unix网络编程》 多进程并发服务器基本模型
- 聊聊Linux fork多进程并发服务器模型
- 高并发解决方案—提升高并发量服务器性能
- 高并发服务器设计之多路复用模型
- 高并发服务器设计之多路复用模型
- 高并发服务器开发--网络模型
- Linux消息队列
- C语言-数据结构-堆排序(heap sort)-源代码
- HDU-1595&3986-枚举+最短路
- 线性规划与网络流24——方格取数问题
- mysql 协议的query包及解析
- (五十一)高并发服务器——多进程模型
- CSS3-颜色渐变--线性渐变+径向渐变
- 【转】一月前端求职记
- 使用Vue-Router 2实现路由功能
- cf 4c Registration system (map学习)
- my self-examination about Miss.Yu's question(2017-1-(24-25))
- Python学习笔记,函数式编程,高阶函数
- python的三元运算
- jQuery知识点总结