Linux服务器模型及其对应的程序流程
一、TCP循环服务器
TCP循环服务器一次只能处理一个客户端的请求,处理完成后,才能接受下一个客户端的请求,程序流程如下:
socket(......);//创建套接字
bind(......);//绑定到某端口
listen(......);//监听客户端连接
while()//循环处理客户端的请求
{
accept(......);//接受一个客户端连接
while()//处理客户端的请求
{
recv(......);
process(......);
send(......);
}
close(......);//关闭当前客户端连接
}
二、UDP循环服务器
UDP循环服务器每次从套接字上读取一个客户端的请求并处理,然后将结果返回给客户机,程序流程如下:
socket(......);//创建套接字
bind(......);//绑定到某端口
while()循环处理客户端的请求
{
recvfrom(......);
process(......);
sendto(......);
}
三、并发处理器
并发处理器是指服务器在同一个时刻可以响应多个客户端的请求,他的思想是每一个客户端的请求并不由服务器进程直接处理,而是创建一个子进程来处理,这可以弥补TCP循环服务器容易出现某个客户端独占服务端的缺陷,程序流程如下:
socket(......);//创建套接字
bind(......);//绑定到某端口
listen(......);//监听客户端连接
while()//循环处理客户端的请求
{
accept(......);//接受一个客户端连接
if(fork(......)==)//创建子进程
{
while()//处理客户端的请求
{
recv(......);
process(......);
send(......);
}
close(......);//关闭当前客户端的连接
exit(......);//子进程退出
}
close(......);//父进程关闭连接套接字,准备接受下一个客户端连接
}
四、多路复用I/O并发服务器
多路复用I/O并发服务器是为了解决创建子进程带来的系统资源消耗问题而提出的,前面几种服务器都是阻塞方式的套接字,使用阻塞方式的套接字,进程的效率比较低,尤其是进行读写操作时。我们可以使用fcntl()或ioctl()函数来改变套接字的属性,将其设置为无阻塞方式,程序流程如下:
socket(......);//创建套接字
bind(......);//绑定到某端口
listen(......);//监听客户端连接
while()//循环处理客户端的请求
{
FD_SET(......);//设置监听读写文件描述符
switch(select(......))//调用select函数
{
case -://发生错误,退出
exit();
case ://超时
break;
default:
if(.....)//新的连接请求建立
{
accept(......);//接受一个客户端连接
FD_SET(......);//将连接套接字加入到监听文件描述符集合中
}
else//可读写的为一个已经创建过连接的描述符
{
......//读写套接字
}
}
}
Linux服务器模型及其对应的程序流程的更多相关文章
- C语言基础知识-程序流程结构
C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...
- 在Linux中运行Nancy应用程序
最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...
- 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序
在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除 ...
- 不错的linux下通用的java程序启动脚本
不错的linux下通用的java程序启动脚本(转载) 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的 ...
- [java学习笔记]java语言基础概述之运算符&程序流程控制&for循环嵌套
一.运算符 算数运算符 +,-,*,/,%,++,-- 1.+,-,*,/ 整数除以整数的结果为舍弃了小数部分的整数. 2.%:取余 %左右都为正数,左边小于右边结果为左边值,如,4%5=4 %左边大 ...
- 不同linux系统添加开机启动程序的命令
see http://phpcj.org/blog/%E4%B8%8D%E5%90%8Clinux%E7%B3%BB%E7%BB%9F%E6%B7%BB%E5%8A%A0%E5%BC%80%E6%9C ...
- Linux如何实现开机启动程序详解
我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO 启动之 ...
- Java变量&&简单程序流程&&循环
变量:强类型局部变量: 1.先赋值,后使用 2.作用范围:从定义开始,到所在代码块结束 3.重合范围内不允许重复命名 数据类型(8中基本类型) byte 1B -128~127 short 2B -3 ...
- Java 基础 程序流程控制 (下)
Java 程序流程控制 (下) 此篇单独对循环结构的知识点进行整理: 之前讲到循环结构分为:for循环,while循环,do...while循环三种最基本的循环结构:在JDK1.5以后的版本还提供了f ...
随机推荐
- 集合和String
集合 Collection 接口 |-List 接口 |-LinkedList 类 |-ArrayList 类 |-Set 接口 |-HashSet 类 |-TreeSet 类 |-LinkedHas ...
- Linux(CentOs6.4)安装Git
安装之前我们先来了解下git,并且要反问下:我为什么要使用git?svn用的不是很好嘛,我干嘛要换?... 问1:为什么需要版本控制系统? 版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订 ...
- JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
前言:最近项目里面需要用到表格的冻结列功能,所谓“冻结列”,就是某些情况下表格的列比较多,需要固定前面的几列,后面的列滚动.遗憾的是,bootstrap table里自带的fixed column功能 ...
- .Net配置中心-Zookeper版
简介 zookeeper的基本概念和作用这里不做介绍,现在很多的公司都在使用它,说起它的作用,可能最先想到的是配置中心,可以将配置项作为一个node存储在zookeeper中,其他应用可以“关注 ...
- C++标准库:std_map作为一个关联数组
摘要:std::map作为一个容器存在一个典型应用就是作为关联数组来作用.在诸如Java等等语言中,关联数组广泛存在.std::map是一个容器,在它的概念框架中存在两个词:键和值,std::map把 ...
- Synchronized
1. 在编写一个类时,如果该类中的代码可能运行与多线程环境下,就要考虑同步问题了. 会同时被多个线程访问的资源,就是竞争资源,也称为竞争条件.对于多线程共享的资源我们必须进行同步,以避免一个线程的改动 ...
- 【转载】浅谈HTTP中Get与Post的区别
[转载]http://www.cnblogs.com/hyddd/ Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们 ...
- vue.js之绑定class和style
一.绑定Class属性. 绑定数据用v-bind:命令,简写成: 语法:<div v-bind:class="{ active: isActive }"></di ...
- CM12.1/13.0编译教程
环境搭建 1.安装64位Ubuntu系统(实体安装.虚拟机安装均可) 注意:要求机器至少4G内存(虚拟机至少分配4G内存),硬盘至少100G空间(源码20G+,编译后整个目录约60~70G) 安装方法 ...
- 12.3 Arithmetic-software-
一.流程图: 二.软件功能: 分为混合模式和单则模式,混合模式生成指定题数的任意四则混合运算,数字是1-10之间随机:单则模式是生成指定题数的加减乘除中指定的某一则运算,数字是1-10之间随机. 用户 ...