用多路复用I/O模型实现支持多个客户端的通信服务

引言

多路复用I/O模型是UNIX/LINUX用得的最多的一种I/O模型。这种I/O模型在技术上的实现是包括select()以及FD_XXX的几个宏及常量。在单个进程中支持的客户端数量由FD_SETSIZE决定。Solaris 10和Linux 9.0默认为1024个,Windows 2000是64个。本文用代码给出该I/O模型处理多Client的一种实现。

用select开发一个通信服务器

这个服务器包括接收模块、发送模块和套接口管理模块。我们只演示与select实现有关的部分,即接收模块和套接口管理模块。下面服务器类关系图:


tcp_listen是tcp实现监听功能,tcp_comm实现tcp的发送和接收,下在我们重点在于recv和sock_list这两个类。sock_list定义如下:

class sock_list
{
public:
// 功能:将一个值插入到list的尾部
// 参数:要插入的tcp_comm对象
void insert(tcp_comm* t);
// 功能:删除一个指定的元素
// 参数:指向要删除的tcp_comm对象的指针
void remove(tcp_comm* t);
// 功能:从队列取得所有的元素
// 参数:存放指向tcp_comm对象指针的向量
void get_all(std::vector<tcp_comm*>& vec);
private:
std::list<tcp_comm*> _sock_list;
};

sock_list实现tcp_comm对象的管理。下面我们来看recv类的定义:

class recv
{
public:
// 功能: 启动通信服务
bool start();
private:
// 功能: 接收核心函数,通过多路复用支持多个客户端
// 返回值: 正常, 0; 失败,-1
int do_select();

// 初始化套接口集合
void init_readfds(const vector<tcp*>& vec, fd_set* set);
private:
sock_list* _list;
tcp_listen* _listen; // 监听套接口
};

start()是给外部调用的:创建监听套接口对象;监听;执行do_select()。init_readfds将监听套接口对象和socket_list中的通信套接口对象加入到套接口读套接口集合中。do_select()比较重要,流程:

用init_readfds初始化读套接口集合;

执行select(),返回进行到下一步;

先检测监听套接口是否有连接到来,并将新的连接加入到sock_list中;

再检测sock_list中的套接口是否有数据可接收。

时间: 2024-09-28 22:51:58

用多路复用I/O模型实现支持多个客户端的通信服务的相关文章

WCF发布由于不支持asp.net兼容性而导致服务无法激活启用

原文http://www.cnblogs.com/xtechnet/archive/2012/06/06/2537979.html 测试发布到虚拟目录中时发生的报错现象,由于不支持asp.net兼容性而导致服务无法激活启用 错误信息: The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this applica

【原创】modb 功能设计之“支持部分MySQL客户端协议”-2

首先看看有哪些资源:1. MySQL 官网 [MySQL Connectors]->[Connector/C (libmysqlclient)] Connector/C (libmysqlclient) is a client library for C development. 官网对 MySQL Connector/C 的完整文档描 述参考 这里 . 重点内容摘录翻译如下 === [22.5. MySQL Connector/C]       MySQL Connector/C 是一个客户端

Twitter新技术:支持可选择的“双重身份验证”服务

5月23日消息,据外媒报道,美国东部时间5月22日,Twitter宣布推出新技术,支持可选择的"双重身份验证"服务,提升用户登录和使用的安全性. 当用户通过网络浏览器登录Twitter时,不仅需要输入正确的登录密码,还必须通过六位数验证码确认自己的身份.该验证码将以短信息的形式发送到用户的手机上;如果通过PC和智能机应用访问Twitter,用户必须使用自动生成的临时密码访问.在Twitter页面的设置菜单中,用户可自由选择是否启用这一服务. 这项新的安全保护服务相当于网络双重验证,它可

最新的php 文件上传模型,支持多文件上传_php技巧

复制代码 代码如下: <?php class UploadModel { protected $keys; protected $err = array(); protected $target; protected $exts; protected $maxSize; protected $randName; protected $files = array(); /** * 初始化变量 */ public function __construct() { $this->exts = arr

《并行计算的编程模型》一1.7 单边通信

1.7 单边通信 在点对点通信和聚合通信方式中,发送进程和接收进程共同参与通信过程.MPI提供另外一种通信方式,即单边通信方式.在单边通信方式中,单个进程便可指定发送和接收的数据.单边通信主要用于ARMCI/GA(见第5章).UPC(见第4章)和OpenSHMEM(见第3章)等函数库中,单边通信也可称之为远程内存访问(RMA). 单边通信模型主要分为三部分.第一部分是创建MPI_Win窗口对象,用于可被其他进程访问的内存区域.第二部分是进程间数据移动方式,包含从远程进程上读.写.更新等数据移动方

net中用基于模型和接口的T4来生成RESTful服务

关键要点 许多REST服务中都包含重复的模式: 如果能自动生成这些模式相关的代码就可以节省很多时间: Visual Studio的T4和EnvDTE具有强大的生成代码功能,不需要更多工具辅助: 也可以用相似技术生成对WCF和数据库的调用: 在Visual Studio中,T4文本模板用文字和控制逻辑的混合物来生成文本文件.控制逻辑是用Visual C#或者Visual Basic语言写成的代码块.在Visual Studio 2015 Update 2及以后版本中,也可以在T4模板指令中使用C#

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器

【原创】modb 功能设计之“支持部分MySQL客户端协议”-3

 在研究完 MySQL 官方文档上对 Connector/C 的说明后,终于可以 开工实践了,先搞个小 demo 出来运行看看.  开发环境:Windows XP SP3 v11 + VS2010 + MySQL Connector/C 6.1.2 测试代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #include <stdio.h> #

传亚马逊靠广告支持将推免费流媒体音乐服务

硅谷网讯 据国外媒体报道,有消息人士透露,亚马逊公司正在考虑推出一项由广告支持的流媒体电视节目与音乐视频服务.这一做法背离了公司此前年费99美元的"金牌"会员订阅策略. 消息人士称,这项服务会在未来数月内发布,可以提供原创内容,也可能包括授权内容.消息人士表示,亚马逊已经同电视剧<Betas>的创作人员展开了谈判,这部由亚马逊联合制作的剧集讲述了一家硅谷创业公司的故事. 两名消息人士指出,亚马逊还计划提供免费的音乐视频,配以推广自家零售网站的广告.例如,搜索歌星布鲁斯·斯普