首页 > 系统 > 关键词 > linux服务器最新资讯 > 正文

Linux网络编程--9.服务器模型

2008-09-08 17:26 · 稿源:互联网

学习过《软件工程》吧.软件工程可是每一个程序员"必修"的课程啊.如果你没有学习过,建议你去看一看.在这一章里面,我们一起来从软件工程的角度学习网络编程的思想.在我们写程序之前,我们都应该从软件工程的角度规划好我们的软件,这样我们开发软件的效率才会高.在网络程序里面,一般的来说都是许多客户机对应一个服务器.为了处理客户机的请求,对服务端的程序就提出了特殊的要求.我们学习一下目前最常用的服务器模型.

循环服务器:循环服务器在同一个时刻只可以响应一个客户端的请求

并发服务器:并发服务器在同一个时刻可以响应多个客户端的请求

9.1循环服务器:UDP服务器
UDP循环服务器的实现非常简单:UDP服务器每次从套接字上读取一个客户端的请求,处理,然后将结果返回给客户机.

可以用下面的算法来实现.

socket(...);
bind(...);
while(1)
{
recvfrom(...);
process(...);
sendto(...);
}

因为UDP是非面向连接的,没有一个客户端可以老是占住服务端.只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足.
9.2循环服务器:TCP服务器
TCP循环服务器的实现也不难:TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接.

算法如下:

socket(...);
bind(...);
listen(...);
while(1)
{
accept(...);
while(1)
{
read(...);
process(...);
write(...);
}
close(...);
}

TCP循环服务器一次只能处理一个客户端的请求.只有在这个客户的所有请求都满足后,服务器才可以继续后面的请求.这样如果有一个客户端占住服务器不放时,其它的客户机都不能工作了.因此,TCP服务器一般很少用循环服务器模型的.

9.3并发服务器:TCP服务器
为了弥补循环TCP服务器的缺陷,人们又想出了并发服务器的模型.并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是服务器创建一个子进程来处理.

算法如下:

socket(...);
bind(...);
listen(...);
while(1)
{
accept(...);
if(fork(..)==0)
{
while(1)
{
read(...);
process(...);
write(...);
}
close(...);
exit(...);
}
close(...);
}

TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况.不过也同时带来了一个不小的问题.为了响应客户机的请求,服务器要创建子进程来处理.而创建子进程是一种非常消耗资源的操作.

9.4并发服务器:多路复用I/O
为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型.

首先介绍一个函数select

intselect(intnfds,fd_set*readfds,fd_set*writefds,
fd_set*exceptfds,structtimeval*timeout)
voidFD_SET(intfd,fd_set*fdset)
voidFD_CLR(intfd,fd_set*fdset)
voidFD_ZERO(fd_set*fdset)
intFD_ISSET(intfd,fd_set*fdset)

一般的来说当我们在向文件读写时,进程有可能在读写出阻塞,直到一定的条件满足.比如我们从一个套接字读数据时,可能缓冲区里面没有数据可读(通信的对方还没有发送数据过来),这个时候我们的读调用就会等待(阻塞)直到有数据可读.如果我们不希望阻塞,我们的一个选择是用select系统调用.只要我们设置好select的各个参数,那么当文件可以读写的时候select回"通知"我们说可以读写了.readfds所有要读的文件文件描述符的集合
writefds所有要的写文件文件描述符的集合

exceptfds其他的服要向我们通知的文件描述符

timeout超时设置.

nfds所有我们监控的文件描述符中最大的那一个加1

在我们调用select时进程会一直阻塞直到以下的一种情况发生.1)有文件可以读.2)有文件可以写.3)超时所设置的时间到.

为了设置文件描述符我们要使用几个宏.FD_SET将fd加入到fdset

FD_CLR将fd从fdset里面清除

FD_ZERO从fdset中清除所有的文件描述符

FD_ISSET判断fd是否在fdset集合中

使用select的一个例子

intuse_select(int*readfd,intn)
{
fd_setmy_readfd;
intmaxfd;
inti;

maxfd=readfd[0];
for(i=1;iif(readfd[i]>maxfd)maxfd=readfd[i];
while(1)
{
/*将所有的文件描述符加入*/
FD_ZERO(&my_readfd);
for(i=0;iFD_SET(readfd[i],*my_readfd);
/*进程阻塞*/
select(maxfd+1,&my_readfd,NULL,NULL,NULL);
/*有东西可以读了*/
for(i=0;iif(FD_ISSET(readfd[i],&my_readfd))
{
/*原来是我可以读了*/
we_read(readfd[i]);
}
}
}

使用select后我们的服务器程序就变成了.

初始话(socket,bind,listen);

while(1)
{
设置监听读写文件描述符(FD_*);

调用select;

如果是倾听套接字就绪,说明一个新的连接请求建立
{
建立连接(accept);
加入到监听文件描述符中去;
}
否则说明是一个已经连接过的描述符
{
进行操作(read或者write);
}

}

多路复用I/O可以解决资源限制的问题.着模型实际上是将UDP循环模型用在了TCP上面.这也就带来了一些问题.如由于服务器依次处理客户的请求,所以可能会导致有的客户会等待很久.

9.5并发服务器:UDP服务器
人们把并发的概念用于UDP就得到了并发UDP服务器模型.并发UDP服务器模型其实是简单的.和并发的TCP服务器模型一样是创建一个子进程来处理的算法和并发的TCP模型一样.

除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种模型.

9.6一个并发TCP服务器实例

#include
#include
#include
#include
#include
#defineMY_PORT8888

intmain(intargc,char**argv)
{
intlisten_fd,accept_fd;
structsockaddr_inclient_addr;
intn;

if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("SocketError:%s\n\a",strerror(errno));
exit(1);
}

bzero(&client_addr,sizeof(structsockaddr_in));
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(MY_PORT);
client_addr.sin_addr.s_addr=htonl(INADDR_ANY);
n=1;
/*如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间*/
setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
if(bind(listen_fd,(structsockaddr*)&client_addr,sizeof(client_addr))<0)
{
printf("BindError:%s\n\a",strerror(errno));
exit(1);
}
listen(listen_fd,5);
while(1)
{
accept_fd=accept(listen_fd,NULL,NULL);
if((accept_fd<0)&&(errno==EINTR))
continue;
elseif(accept_fd<0)
{
printf("AcceptError:%s\n\a",strerror(errno));
continue;
}
if((n=fork())==0)
{
/*子进程处理客户端的连接*/
charbuffer[1024];

close(listen_fd);
n=read(accept_fd,buffer,1024);
write(accept_fd,buffer,n);
close(accept_fd);<
  • 相关推荐
  • 大家在看
  • 谷歌和英特尔警告Linux中存在高严重的蓝牙安全漏洞

    谷歌和英特尔警告说,除了最新版本的Linux内核外,其他所有版本的Linux内核都存在高严重性蓝牙漏洞。谷歌的一位研究人员表示,该漏洞允许攻击者在蓝牙范围内无缝执行代码,而英特尔则将该漏洞定性为提供特权升级或信息泄露。

  • 新的NTFS Linux内核驱动修订了九次 仍在审核中

    在8月份的时候,Paragon软件公司高调宣布,他们的NTFS读写驱动在作为商业驱动提供给那些需要在Linux上对微软文件系统进行可靠支持的用户多年后,将在Linux内核中进行主线开发。两个月后,他们已经对这个驱动进行了第九次修订,以争取将其纳入内核主线。

  • Linux 5.9.1以及部分旧版稳定内核已解决 "Bleeding Tooth"漏洞问题

    Linux5.9正式发布刚过去一周,修正版本的内核5.9.1就已经跟随而来,让这个稳定版本更值得关注的是包括了本周被Google与英特尔的安全人员公开及警告的"BleedingTooth"蓝牙漏洞的修复。BleedingTooth是一个影响Linux的远程代码执行漏洞,源于L2CAP代码中基于堆的类型混乱。

  • 知名程序员分析微软 Windows 未来或成 Linux 子系统

    微软的 Windows 10 已经发布两版 Windows subsystem For Linux,实现 Linux 二进制代码在 Windows 环境中运行。微软一直都在向开源社区示好,当然也包括 Linux,微软还将推出 Linux 版的 Edge 浏览器。知名程序员 Eric S Raymond 分析称,由于个人电脑市场业务正在下滑,对微软来说,有利可图的业务是 Azure,而且 Azure 运行在 Linux 上的机器要多与 Windows。Raymond 表示,微软以后可能会放弃

  • Linux Kernel 5.10本周合并引入了对 AMD/Intel新硬件的性能代码支持

    本周一的 Linux 5.10 窗口合并,为“Perf”子系统添加了对 AMD 和 Intel 新硬件的支持。除了大量的 Intel / AMD x86 更改,还有 Ingo Molnar 发出的性能事件查询请求。以 AMD Zen / Zen 2 处理器的运行时平均功率限制(RAPL)为例,其代码现已扩展适用于 Family 19h(即 Zen 3),辅以专为 AMD 制定的诸多性能修复。

  • 麒麟OS宣布兼容中望CAD:国内第一款Linux版自主CAD软件

    在Linux内核的系统上,日常使用的软件基本不是问题,麻烦的是一些专业软件,生产力跟不上是限制Linux的重要因素。今天国内的麒麟OS开发商中标软件宣布完成中望CAD的认证,这是国内首款Linux下的

  • 研究人员担心BleedingTooth蓝牙漏洞给Linux系统带来风险

    基于Linux的操作系统通常被认为比Windows等系统更安全,但这并不意味着它们完全没有安全问题。谷歌安全研究人员已经对Linux蓝牙堆栈中的一系列"零点击"漏洞发出警告。该漏洞被称为BleedingTooth,最坏的后果是带来远程代码执行攻击。

  • NVIDIA预计再过一个月才会有Linux 5.9驱动支持

    虽然NVIDIA在支持新版本的Linux内核方面通常都很及时,通常会争取在新系列的发布候选版本结束前出一个驱动程序,但就最近新出的Linux5.9内核而言,它需要的时间更长。NVIDIA上周五向客户发出提醒,他们预计在11月中旬之前,也就是内核发布稳定后一个月左右,他们的专有显卡驱动才会有Linux5.9内核支持。

  • 开源爱好者:Windows将被微软放弃、沦为Linux子系统

    Windows 10已经发布了两版Windows subsystem For Linux(WSL),也就是实现了Linux二进制代码在Windows环境下运行。开源软件爱好者Eric S Raymond开始认真审视微软的做法,包括微软即将面向Li

  • 为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息

    AMD在不经意间泄露了自家下一代APU的信息,其代号“Van Gogh(梵高)”。据外媒报道称,AMD为下一代Van Gogh APU向Linux贡献了27.5万行代码,而GPU内核驱动已经为Van Gogh进行内核级

    AMD
  • 云安全日报200924:Linux内核发现最高系统特权升级漏洞,需要尽快升级

    9月23日,openwall邮件组发布了有关Linux内核特权升级漏洞的风险通知。该漏洞级别为高风险,因为该漏洞存在于内核中,所以如果成功利用该漏洞,将直接获得最高的系统特权。此漏洞带来的最大威胁是对数据机密性和完整性以及系统可用性的威胁。以下是漏洞详情:漏洞详情CVE-2020-14386 CVSS评分:7.8 严重程度:高该漏洞级别为高风险,本地攻击者可以通过向受影响的主机发送特制的请求内容来导致特权升级。因为该漏洞存在于内核(Ke

  • 如何通过SSD服务器配置评测选择美国服务器

    独立服务器是目前比较常见的建站空间产品,用服务器的站长往往也是比较看重服务器的一些性能,包括存储空间,访问速度,稳定性,更高一点要求会对硬盘的存储速度也比较看重,因此目前很多的SSD固态硬盘独立服务器在市场上比较流行。 不过选择一款比较好的服务器还是非常有讲究的,从服务器商的实力,产品的配置,技术支持,售后服务等等,都要全方面的考虑。这篇文章分享一下如何从服务器口碑及产品配置细节来选择一款合适的独立?

  • 苹果部分服务器宕机问题目前已修复

    9月30日消息,据外媒报道,不少网友反馈,苹果的几项服务似乎都遇到“服务器中断”的问题。消息称,Apple Music、Apple TV+、Apple News+、App Store等功能都出现了问题。例如,当尝试访问Apple Music或Apple TV+时,一些人的服务拒绝加载,并弹出连接警告。随后,该消息得到了苹果系统状态页面的证实。尽管目前尚不清楚造成服务中断的原因是什么,但大约三小时后,苹果似乎已经解决了问题。这让人想起上一次苹果服务?

  • 苹果:服务器中断已恢复 iCloud、音乐等服务正常使用

    就在刚刚,苹果官方给出消息称,今天早些时候出现的服务器中断问题已经修复。

  • Netflix宣布取消30天免费试用服务

    据外媒报道,接下来,用户要么完全支持Netflix要么完全退出,因为这家流媒体巨头已经取消了他们的免费试用服务。现在,用户必须要注册一个Netflix的套餐才行,不过该套餐没有合同约束,用户可以随时取消。

  • 通过盲盒传递温度 KOLILIKO自有生态优势初显

    2020 年CICF中国国际漫画节动漫游戏展在国庆期间如期举办,新生潮玩品牌KOLILIKO口力力口(以下简称KOLILIKO)作为主办方合作伙伴受邀参展,携两大自主IP首次线下亮相。在赛道愈发拥挤的盲盒领域,新品牌如何突出重围? 行业赛道加剧争抢 自有生产链优势初显 潮玩行业在近两年增长迅猛,无论资本还是企业,都纷纷抢夺赛道,渴望从中分一杯羹。也有专家表示,潮玩行业尚处于发展初期,行业处于风口小趋势,至少还有五年高速增长态势。

  • 苹果服务器崩了!iCloud等无法访问、千万别刷机

    ​北京时间今晨,苹果全球多个服务出现宕机和网络中断情况。截止上午 10 点 00 分,苹果中国系统状态页面显示,仍有包括iCloud通讯录、网页APP、云备份、Apple Pay、Apple Music等在内的二十多项服务处于中断状态。

  • 美国土安全部发布紧急警告:Windows服务器存在“严重”漏洞

    美国国土安全部网络安全与基础设施安全局(CISA)发布了一项罕见的紧急指令,敦促政府机构为Windows服务器的一个“关键”漏洞安装补丁,该漏洞被安全机构称为Zerologon。

  • 西部数码云服务器CC防护全新升级:高效防御更省钱!

    CC攻击,是指攻击者通过模拟大量用户访问,制造高并发请求,从而消耗掉服务器CPU、带宽等资源,最终导致服务器瘫痪,目标网站或应用无法正常提供服务,破坏性非常大。但因为CC攻击不像ddos攻击可以用硬件防火墙来过滤攻击,对于一般企业用户来说,防护难度很大。为帮助广大企业和个人站长有效抵御CC攻击,维护服务器网络安全,西部数码研发团队近日对云服务器CC防护进行重磅升级。全新升级后的CC防护功能可满足用户不同的防护需求?

  • 腾讯云服务器双十一大额代金券领取地址 2020腾讯云服务器优惠代金券

    腾讯云服务器在最近开启了双十一的预热活动——云上盛惠,其中可以领取到超大额的代金券大礼包,有个人券和企业券,一些小伙伴还不清楚腾讯云服务器的这些代金券在哪领取,下面就来为大家分享一下。

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议
  • 热门标签