【Linux网络编程】并发服务器之多进程模型
00. 目录
文章目录
- 00. 目录
- 01. 概述
- 02. 多进程并发服务器
- 03. 多进程并发服务器实现思路
- 04. 多进程并发服务器实现
- 05. 附录
01. 概述
服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器。
循环服务器与并发服务器模型
在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求。
目前最常用的服务器模型
- 循环服务器:服务器在同一时刻只能响应一个客户端的请求。
- 并发服务器:服务器在同一时刻可以响应多个客户端的请求。
02. 多进程并发服务器
一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求)。并发服务器设计技术一般有:多进程服务器、多线程服务器、I/O复用服务器等。
在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中。对于一个 TCP 服务器,客户与服务器的连接可能并不马上关闭,可能会等到客户提交某些数据后再关闭,这段时间服务器端的进程会阻塞,所以这时操作系统可能调度其它客户服务进程,这比起循环服务器大大提高了服务性能。
03. 多进程并发服务器实现思路
TCP 并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理。
#include <头文件>int main(void)
{//创建套接字//绑定套接字//设置监听while(1){int connfd = accept();//子进程if (0 == fork()){//关闭监听套接字close(sockfd);//数据处理//关闭连接套接字close(connfd);exit(0);}//关闭已经连接的套接字close(connfd);}close(sockfd);return 0;
}
04. 多进程并发服务器实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main(int argc, char *argv[])
{unsigned short port = 8080; // 本地端口 // 创建tcp套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0){perror("socket");exit(-1);}// 配置本地网络信息struct sockaddr_in my_addr;bzero(&my_addr, sizeof(my_addr)); // 清空 my_addr.sin_family = AF_INET; // IPv4my_addr.sin_port = htons(port); // 端口my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip// 绑定int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if( err_log != 0){perror("binding");close(sockfd); exit(-1);}// 监听,套接字变被动err_log = listen(sockfd, 10); if(err_log != 0){perror("listen");close(sockfd); exit(-1);}while(1) //主进程 循环等待客户端的连接{char cli_ip[INET_ADDRSTRLEN] = {0};struct sockaddr_in client_addr;socklen_t cliaddr_len = sizeof(client_addr);// 取出客户端已完成的连接int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);if(connfd < 0){perror("accept");close(sockfd);exit(-1);}pid_t pid = fork();if(pid < 0){perror("fork");_exit(-1);}else if(0 == pid){ //子进程 接收客户端的信息,并发还给客户端/*关闭不需要的套接字可节省系统资源,同时可避免父子进程共享这些套接字可能带来的不可预计的后果*/close(sockfd); // 关闭监听套接字,这个套接字是从父进程继承过来char recv_buf[1024] = {0};int recv_len = 0;// 打印客户端的 ip 和端口memset(cli_ip, 0, sizeof(cli_ip)); // 清空inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);printf("----------------------------------------------\n");printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));// 接收数据while( (recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0 ){printf("recv_buf: %s\n", recv_buf); // 打印数据send(connfd, recv_buf, recv_len, 0); // 给客户端回数据}printf("client closed!\n");close(connfd); //关闭已连接套接字exit(0);}else if(pid > 0){ // 父进程close(connfd); //关闭已连接套接字}}close(sockfd);return 0;
}
05. 附录
【Linux】一步一步学Linux网络编程教程汇总
【Linux网络编程】并发服务器之多进程模型相关推荐
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...
- 【Linux网络编程】并发服务器之select模型
00. 目录 文章目录 00. 目录 01. 概述 02. I/O复用技术概述 03. select模型服务器实现思路 04. select模型服务器实现 05. 附录 01. 概述 服务器设计技术有 ...
- 【Linux网络编程】并发服务器之多线程模型
00. 目录 文章目录 00. 目录 01. 概述 02. 多线程服务器 03. 多线程服务器实现思路 04. 多线程服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按使用的协议来分有 ...
- linux网络编程学习笔记之三 -----多进程并发服务端
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
- Linux 网络编程——并发服务器的三种实现模型
服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多 ...
- Linux网络编程 | 并发模式:半同步/半异步模式、领导者/追随者模式
文章目录 同步与异步 半同步/半异步模式 变体:半同步/半反应堆模式 改进:更高效的半同步/半异步模式 领导者/追随者模式 组件 :句柄集.线程集.事件处理器 并发模式是指I/O处理单元和多个逻辑单元 ...
- 【Linux】一步一步学Linux网络编程教程汇总(更新中......)
00. 目录 文章目录 00. 目录 01. 基础理论知识 02. 初级编程 03. 高级编程 04. LibEvent库 05. 06. 07. 01. 基础理论知识 [Linux网络编程]网络协议 ...
- 【Linux网络编程】循环服务器之TCP模型
00. 目录 文章目录 00. 目录 01. 概述 02. TCP循环服务器实现方法 03. TCP循环服务器模型 04. TCP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按使 ...
- 【Linux网络编程】循环服务器之UDP循环模型
00. 目录 文章目录 00. 目录 01. 概述 02. UDP循环服务器的实现方法 03. UDP循环服务器模型 04. UDP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按 ...
最新文章
- IOT数据库选型——NOSQL,MemSQL,cassandra,Riak或者OpenTSDB,InfluxDB
- 解决使用CoreData时报duplicate symbol错误问题
- mysql分库分表总结
- bzoj1601: [Usaco2008 Oct]灌水
- 【Hibernate】JDBC操作与hibernate的区别
- BABOK - 需求管理和沟通(Requirements Management and Communication)概要
- MVC阻止用户注入JavaScript代码或者Html标记
- 携程集团CMO孙波入选“2021亚太营销领袖50强”榜单
- MLflow机器学习工作流框架更新(2019.3)
- 大数据实战之环境搭建(十)
- Delphi中TStringList类常用属性方法详解
- python判断用户名密码是否正确_Python账号密码登陆判断(三次机会)
- 个人计算机键盘上的按键击键声音小,按键盘每个键出现嘟嘟的声音也打不出字是什么...
- 好一个“Exchange20003”
- 一个屌丝程序猿的人生(八十六)
- 如何用Excel制作工作计划,跟踪任务进度,快来学习吧
- 【ZYNQ】那些年我们拿下了 Zynq
- Java实现 蓝桥杯VIP 算法提高 我们的征途是星辰大海
- Could not delete path ‘D:\AndroidStudioProjects\LargeScreen\app\build\generated\source\r\debug\andro
- #十二、编写三角形类Triangle,初始化三个属性,分别是三条边的长度,定义一个计算并打印周长的函数 #十三、编写等腰三角形类EWtriangle,继承于三角形类,初始化只用传一个腰长和一个底长,定
热门文章
- 博客园——记录我的开始
- 谈谈DictionaryT1,T2和ListT的问题
- OnInit 和 Page_Init 事件有什么不同
- iPhone SDK发布
- 有关计算机代码的游戏,七灯游戏是一款经典的益智类游戏。游戏中,有七盏灯排成一圈,如图a所示,初始时灯的开关状态随机生成,操作其中某一盏灯,则可以切换该灯的“开/关”状态,同时,这盏灯-组卷网...
- C语言程序练习-L1-017 到底有多二 (15分)
- Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))
- Java黑皮书课后题第2章:*2.17(科学:风寒温度)外面有多冷?...twc=35.74+0.6215ta-35.75v0.16+0.4275tav0.16,输入度数、风速显示风寒温度
- 数据结构与算法一 - 二叉树基础
- OWASP出品:Xenotix XSS漏洞测试框架及简单使用