用多路复用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中的所有套接口句柄
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一个子进程处理。在单进程中处理多个客户端的目的是使开发的程序更易理解、维护;多进程往往较单进程复杂些。
更多精彩
赞助商链接