WEB开发网
开发学院软件开发VC 用多路复用I/O模型实现支持多个客户端的通信服务 阅读

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

 2010-02-19 20:33:09 来源:WEB开发网   
核心提示:实现代码:int recv::do_select(){fd_set readfds;int listen = _listen->get_handle();while (true){vector<tcp_comm*> vec;_list->get_all(vec);// 获得sock_list中的

实现代码:

int recv::do_select()
{
fd_set readfds;
int listen = _listen->get_handle();
while (true)
{
vector<tcp_comm*> vec;
_list->get_all(vec);  // 获得sock_list中的所有套接口句柄
init_readfds(vec, &readfds);
select(...);
// 检查监听套接字句柄,有新的连接到,建立新的连接
if (FD_ISSET(listen, &readfds)) 
{
tcp_comm* client = new tcp_comm;
_listen->accept(*client);
_list->insert(client);// 将已连接的套接字对象放到sock_list中
}
// 检查所有的客户端套接字句柄
vector<tcp_comm*>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
{
if (FD_ISSET((*it)->get_handle(), &readfds))
// 这里是*it作为参数进行数据接收
}
}
}

为减少代码量,我省去了出错处理、细节;本来类都在某个名称空间中的,也省去了。

多进程(线程)和select合作

上面是在一个进程中的情况,可以考虑多线程中每一个线程实现select。以solaris 10为例,开100个线程,一个线程支持1024个套接口,那就是100 * 1024,10万个。集群服务中的前端均衡器的实现可以考虑一下这个技术,不过效率将是一个极大的考验。

结论

本文重点讲述在单进程的环境使用select支持多个客户端。经常看见一些服务程序,用到了select也是来一个连接,fork一个子进程处理。在单进程中处理多个客户端的目的是使开发的程序更易理解、维护;多进程往往较单进程复杂些。

上一页  1 2 

Tags:多路 复用 模型

编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接