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 ...
随机推荐
- jqgrid
官方主页 http://www.jqgrid.com/目前最新版本:jqGrid 3.7 Beta在线文档: http://www.secondpersonplural.ca/jqgriddocs/i ...
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- 处理 pcap 中的 mac 二进制字节流为可读格式
import struct # 利用 struct 处理字节流中的mac地址 适用于小端地址操作系统 def mac2str(bi_mac): mac = "" for i in ...
- logging 模块误用导致的内存泄露
首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging ...
- CSS 概念 & 作用
http://www.cnblogs.com/moveofgod/archive/2012/09/18/2691101.html 式样定义 如何显示 HTML内容 通常存储在式样表中 作用 : 解 ...
- xpth 字符串截取
<xsl:value-of select="substring(//div[@class='infos'],1,27)"/>
- python3的基础练习题
1. 执行 Python 脚本的两种方式 1)/usr/bin/python3 xx.py 2)python3 xx.py #注xx.py需要在内容里面调用由什么解释器执行 2. 简述位.字节的关系 ...
- HTTP超文本传输协议-HTTP/1.1中文版
摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...
- SDL 显示解码后的yuv12数据
在上篇h264解码为yuv12后http://jhlong12345.blog.163.com/blog/static/1230631292015725115058709/ ,需要显示出来,使用sdl ...
- Google Maps API V3 之绘图库 信息窗口
Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...