一、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服务器模型及其对应的程序流程的更多相关文章

  1. C语言基础知识-程序流程结构

    C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...

  2. 在Linux中运行Nancy应用程序

    最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...

  3. 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

    在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除 ...

  4. 不错的linux下通用的java程序启动脚本

    不错的linux下通用的java程序启动脚本(转载) 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的 ...

  5. [java学习笔记]java语言基础概述之运算符&程序流程控制&for循环嵌套

    一.运算符 算数运算符 +,-,*,/,%,++,-- 1.+,-,*,/ 整数除以整数的结果为舍弃了小数部分的整数. 2.%:取余 %左右都为正数,左边小于右边结果为左边值,如,4%5=4 %左边大 ...

  6. 不同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 ...

  7. Linux如何实现开机启动程序详解

    我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO 启动之 ...

  8. Java变量&&简单程序流程&&循环

    变量:强类型局部变量: 1.先赋值,后使用 2.作用范围:从定义开始,到所在代码块结束 3.重合范围内不允许重复命名 数据类型(8中基本类型) byte 1B -128~127 short 2B -3 ...

  9. Java 基础 程序流程控制 (下)

    Java 程序流程控制 (下) 此篇单独对循环结构的知识点进行整理: 之前讲到循环结构分为:for循环,while循环,do...while循环三种最基本的循环结构:在JDK1.5以后的版本还提供了f ...

随机推荐

  1. Ubuntu 下配置apache和APR

    软件环境:ubuntu14.04  虚拟机Vmware  软件:http://httpd.apache.org/  httpd-2.2.29.tar.gz  不需要单独下载APR. 1.解压apach ...

  2. SOA总结(图片打开略慢请知晓)

  3. lambda与常用内置函数

    lambda表达式: lambda arg:arg+1 数值操作: abs() 求绝对值 abs(-1) bin() 将十进制转换成二进制   bin(3) ,’0b11’ hex() 十进制转换为十 ...

  4. c#线程间操作UI-Invoke和BeginInvoke

    利用Invoke和或BeginInvoke实现线程间操作UI的简单例子. /* 窗体包含一个button和一个richtextbox控件 * 注:必须在子线程中执行Invoke和或BeginInvok ...

  5. nginx平滑升级

    1.查询原来安装配置信息 [root@t-scrmap1-v-szzb local]# netstat -unlatp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0: ...

  6. [Think In Java]基础拾遗4 - 并发

    第21章节 并发 1. 定义任务 任务:任务就是一个执行线程要执行的一段代码.(在C语言中就是函数指针指向的某个地址开始的一段代码) [记忆误区]:任务不是线程,线程是用来执行任务的.即任务由线程驱动 ...

  7. 亿级 Web 系统的容错性建设实践

    一. 重试机制 最容易也最简单被人想到的容错方式,当然就是“失败重试”,总而言之,简单粗暴!简单是指它的实现通常很简单,粗暴则是指使用不当,很可能会带来系统“雪崩”的风险,因为重试意味着对后端服务的双 ...

  8. hue install

    http://ju.outofmemory.cn/entry/105162 Hue是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera ...

  9. 一次完整的HTTP请求所经历的7个步骤

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  10. zendstudio快捷键收录

    360截屏快捷键:ctrl+shift+x zendstudio:注释代码:ctrl+shift+/ 删除光标所在行:ctrl+D 复制当前行:ctrl+alt+↓ 上下行互换:alt+↑/↓ 代码格 ...