/*** cloud_sum_server ***/
void cloud_sum(int sockfd)
{
ssize_t n;
char buf[MAXLINE];
long a = , b = ;
again:
while ( (n = read(sockfd, buf, MAXLINE)) > ){
if (sscanf(buf, "%ld %ld", &a, &b) > )
snprintf(buf, sizeof(buf), "%ld\n", a + b);
else
snprintf(buf, sizeof(buf), "input error\n"); n = strlen(buf);
write(sockfd, buf, n);
fputs(buf, stdout);
bzero(buf, sizeof(char) * MAXLINE);
} if (n < && EINTR == errno)
goto again;
else if (n < )
cout<<"read error!"<<endl;
else if ( == n)
cout<<"EOF"<<endl;
}

单进程和使用select的服务器程序

第一个客户建立连接前的服务器状态:

服务器只维护一个读描述符集时:描述符0、1和2分别被设置为标准输入、标准输出和标准错误输出,故监听套接字的第一个可用描述符是3。

描述符集中唯一的非0项是表示监听套接字的项,因此select的第一个参数将为4。

    

client整型数组包含了每个客户的已连接套接字描述符,所有元素初始化为-1。

当第一个客户与服务器建立连接时,监听描述符变为可读,服务器于是调用accept。本例中accept返回的新的已连接描述符将是4。

从现在起,服务器必须在client数组中记住每个新的已连接描述符,并将它们加到描述符集中去。

    

第二个客户与服务器建立连接:

    

如果第一个客户终止它的连接,该客户的TCP发送一个FIN,使得服务器中的描述符4变为可读。

当服务器读这个已连接套接字时,read将返回0,于是关闭该套接字并相应地更新数据结构:

把client[0]的值置为-1,把描述符4的位设置为0,但maxfd的值不变。

    

当有新客户到达时,在client数组的第一个可用项(即值为-1的第一个项)中记录其已连接套接字的描述符,并把它加到读描述符集中。

服务器所能处理的最大客户数目的限制是以下两个值中的较小值:FD_SETSIZE和内核允许本进程打开的最大描述符数。

如果一个恶意客户连接到服务器,发送一个字节的数据(不是换行)后进入睡眠。

服务器将调用read从客户读入这个单字节的数据,然后阻塞于下一个read调用,以等待来自该客户的其余数据。

服务器于是因为这个客户而被阻塞(挂起),不能为其他任何客户提供服务,直到那个恶意客户发出一个换行符或终止为止。(拒绝服务denial of service攻击)。

可解决的办法如:

1)使用非阻塞式I/O;

2)让每个客户由单独的控制线程提供服务(例如创建一个子进程或一个线程来服务每个客户);

3)对I/O操作设置一个超时。

Linux服务器的更多相关文章

  1. Linux服务器安全配置

    众所周知,网络安全是一个非常重要的课题,而服务器是网络安全中最关键的环节.Linux被认为是一个比较安全的Internet服务器,作为一种开放源代码操作系统,一旦Linux系统中发现有安全漏洞,Int ...

  2. .NET跨平台之旅:将QPS 100左右的ASP.NET Core站点部署到Linux服务器上

    今天下午我们将生产环境中一个单台服务器 QPS(每秒请求数)在100左右的 ASP.NET Core 站点部署到了 Linux 服务器上,这是我们解决了在 .NET Core 上使用 EnyimMem ...

  3. 如何使用Linux命令行查看Linux服务器内存使用情况?

    一个服务器,最重要的资源之一就是内存,内存够不够用,是直接关系到系统性能的关键所在. 本文介绍如何查看Linux服务器内存使用情况, 1.free命令 free -m [root@localhost ...

  4. 检查Linux服务器性能

    如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在? 概述通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. • uptime• ...

  5. linux下的ssh工具之,本地上传到linux服务器and Linux服务器文件另存为本地。非sftp工具。

    首先,当你只有一个ssh工具可以连接linux,但你有想把文件在 linux 和windows(本地)直接的切换.其实可以的: 本文参考 1.将本地的文件,放到ssh远程的linux服务器上: 首先要 ...

  6. CentOS Linux服务器安全设置

    转自:http://www.osyunwei.com/archives/754.html 引言: 我们必须明白:最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关 ...

  7. 配置linux服务器的一些操作

    本次课程实验,我们选择的是ubuntu 14.04操作系统,不像使用RDP连接windows服务器那样可以直观的看到远程端的图形界面,只能通过Xshell以命令行进行操作,那么就来说说配置远程linu ...

  8. 用十条命令在一分钟内检查Linux服务器性能

    转自:http://www.infoq.com/cn/news/2015/12/linux-performance 如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出L ...

  9. Linux服务器宕机案例一则

    案例环境 操作系统 :Oracle Linux Server release 5.7 64bit 虚拟机 硬件配置 : 物理机型号为DELL R720 资源配置 :RAM 8G Intel(R) Xe ...

  10. 记一次Linux服务器上查杀木马经历

    开篇前言 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,Linux上的病毒.木马较少,二则由于宣称Linux是最安全的操作系统,导致很多人对Linux ...

随机推荐

  1. MVC过滤器详解 面向切面编程(AOP)

    面向切面编程:Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个 ...

  2. Hadoop学习笔记: MapReduce二次排序

    本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...

  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台

    RDIFramework.NET ━ .NET快速信息化系统开发框架  工作流程组件Web业务平台 接前两篇: RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介 ...

  4. 《30天自制操作系统》17_day_学习笔记

    harib14a: 接着上一天的内容,我们来思考一个问题:当所有的LEVEL中都没有任务的时候怎么办?采用前面定时器链表中加入“哨兵”的思路,我们加入一个idle任务,去执行HLT.接下来我们只需要将 ...

  5. hdu 1175冒牌连连看

    #include <bits/stdc++.h> using namespace std; const int N = 1005; int arr[N][N]; int vis[N][N] ...

  6. Java Spring DI之旅

    做过.NET的人很多都用过Microsoft Enterprise Library,里面有一个Dependency injection工具Unity,我们可以使用它来实现依赖注入:什么是依赖注入呢?我 ...

  7. yii2框架原生的结合框架使用的图片上传

    首先我们要从model层开始写起,主要是为了创建验证规则,还有图片上传的路径以及图片的命名规则(UploadForm.php) 接下来我们要在控制器层写好业务逻辑,就是什么情况下直接在调用model层 ...

  8. HDU Coprime

    Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  9. Android中插件开发篇之----类加载器

    关于插件,已经在各大平台上出现过很多,eclipse插件.chrome插件.3dmax插件,所有这些插件大概都为了在一个主程序中实现比较通用的功能,把业务相关或者让可以让用户自定义扩展的功能不附加在主 ...

  10. windows 中 使用MongoDB

    MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式. 传统的关系数据库一般由 ...