(五十一)高并发服务器——多进程模型
2017-01-24 21:21
501 查看
使用多进程并发服务器时要考虑以下几点:
1.父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)
2.系统内创建进程个数(内存大小相关)
3.进程创建过多是否降低整体服务性能(进程调度)
多进程高并发服务器模型如下(简笔画):
测试方法就是:
打开四个终端:
1.一个用于运行server程序
2.两个个用于运行client程序(这两个程序都可以输入字符串,并会收到大写的字符串)
3.一个用于观察:
使用命令pa -aux和netstat -apn | grep 8000
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 4096 int 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 4096 int 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
相关文章推荐
- 这个模型用来测试并发服务器,是否会产生僵尸进程
- 《Unix网络编程》 多进程并发服务器基本模型
- 【Unix 网络编程】服务器网络编程模型——多进程并发模型
- 9 多进程并发服务器模型
- 聊聊Linux fork多进程并发服务器模型
- 高效并发服务器模型
- 单进程socket的服务器/客户端模型
- 高并发服务器设计之多路复用模型
- UNIX网络编程----多进程并发服务器(这样就支持多个客户端连接了)
- C#如何实现用socket建立并发服务器模型?
- 【并发服务器系列】1 停等模型
- 使用Select I/O模型来实现一个并发处理多个客户端的TCP服务器
- 一种并发服务器关于进程的问题
- 套接字编程——多进程并发服务器
- 从nginx角度看服务器多进程模型设计(一)
- 从nginx角度看服务器多进程模型设计(二)
- 多进程并发服务器编程
- 并发服务器模型
- 避免僵尸进程的产生 & 一个有用的服务器模型
- 并发服务器模型:IO复用循环服务器