多进程TCP并发服务器
时间:2022-06-11
本文章向大家介绍多进程TCP并发服务器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多进程TCP并发服务器
最初的服务器都是迭代服务器,服务器处理完一个客户的请求,再接受下一个客户的请求。但是我们的期望应该是一台服务器同时为多个客户服务。实现并发服务器最简单的办法就是为每个客户均fork
一个子进程。
基本思路
基本流程是,建立连接,accept
返回后,服务器调用fork
,子进程通过已连接套接口(connfd
)为客户提供服务,父进程通过监听套接口(listenfd
)等待另一个连接。子进程开始处理客户后,父进程便关闭已连接套接口。
...
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
for ( ; ; ) {
connfd = accept(listenfd, (SA *) &cliaddr, &clilen));
if ( (childpid = Fork()) == 0) { /* 子进程 */
close(listenfd); /* 子进程关闭监听套接口 */
doit(connfd); /* 子进程通过已连接套接口处理请求 */
close(connfd); /* 子进程处理请求完毕,关闭已连接套接口
/* 这一步可省略,因为exit会关闭所有由内核打开的描述字 */
exit(0); /* 子进程结束 */
}
close(connfd); /* 父进程关闭已连接套接口 */
}
描述字访问计数
对TCP套接口调用close
会引发FIN,终止连接。但是上面父进程的Close(connfd)
却并没有影响子进程使用这个描述字进行客户请求处理,这是因为,父进程调用close
只是将它的文件表项访问计数减一,文件表项访问计数值为0时才真正关闭。
-
accept
返回,connfd
计数=1 -
fork
返回,connfd
计数=2 - 父进程
close
,connfd
计数=1 - 子进程
close
,connfd
计数=0,引发FIN,终止连接
分步骤状态图解
下图是服务器阻塞于accept
调用、连接请求从客户到达时客户和服务器的状态。
accept
返回后,就有下图的状态。连接被内核接受,新的套接口即connfd
被创建,这个已连接套接口,可用来读写数据。
并发服务器的下一步是调用fork
,下图是从fork
返回后的状态。此时描述字listenfd
和connfd
是父进程-子进程共享的。
下一步是父进程关闭已连接套接口,子进程关闭监听套接口。
最后的结果是子进程处理与客户的连接,父进程可对监听套接口调用accept
来处理下一个连接。
- flex中使用swc实现更好的界面代码分离
- Redis Cluster集群总结性梳理
- jquery的html,text,val
- Redis Cluster日常操作命令梳理
- MongoDB数据存储-深入了解
- Linux下通过受限bash创建指定权限的账号
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (上)
- MongoDB副本(一主一备+仲裁)环境部署记录
- 根据前后的子串求中间串的函数
- Centos6下zookeeper集群部署记录
- 抓取百度指数引发的图像数字识别
- 真正将标注文字遮盖的方法
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (中)
- li浮动时ul高度为0,解决ul自适应高度的几种方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在JSP里使用Java bean
- 获取指定时间内指定星期几的所有日期
- 使用JSP的标准标签库JSTL处理XML格式的数据
- (一)初识Mybatis-Plus
- org.apache.tomcat.util.scan.StandardJarScanner找不到serializer.jar的问题
- JAVA中获取当前系统时间
- 使用Supervisor管理进程
- vue 中使用threejs
- 数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同
- 生成项目目录树
- 几行代码搞定智能插座控制丨云开发 × 涂鸦
- Elasticsearch Mapping是啥?
- 求水仙花数面试题 撸它
- 字典序???你是啥
- 【特征工程】时序特征挖掘的奇技淫巧