- 浏览: 2966265 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (2529)
- finance (1459)
- technology (218)
- life (343)
- play (150)
- technology-component (0)
- idea (6)
- house (74)
- health (75)
- work (32)
- joke (23)
- blog (1)
- amazing (13)
- important (22)
- study (13)
- Alternative (0)
- funny (8)
- stock_technology (12)
- business (16)
- car (21)
- decorate (4)
- basketball (2)
- English (16)
- banker (1)
- TheBest (1)
- sample (2)
- love (13)
- management (4)
最新评论
-
zhongmin2012:
BSM确实需要实践,标准ITIL服务流程支持,要做好,需要花费 ...
BSM实施之前做什么 -
shw340518:
提示楼主,有时间逻辑bug:是你妈二十那年写的 那会儿连你爹都 ...
80后辣妈给未来儿子的信~我的儿,你也给我记住了~~~ -
guoapeng:
有相关的文档吗?
it项目管理表格(包含146个DOC文档模板) -
solomon:
看到的都是 这种 CTRL+C 和 CTRL+V 的文章, ...
Designing a website with InfoGlue components -
wendal:
恩, 不错. 有参考价值
Designing a website with InfoGlue components
最有说服力了!
先汗一个!
先汗一个!
cpp 代码
- #pragma once
- #include <errno.h>
- #include <sys/epoll.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include "log.h"
- #ifndef EPOLL_SIZE
- #define EPOLL_SIZE 4096
- #define EPOLL_CONTEXT_SIZE (4096+256)
- #endif
- typedef void * EPollerContext;
- class Epoller
- {
- public:
- Epoller(){}
- virtual ~Epoller(){}
- bool create()
- {
- memset(_contexts,0,sizeof(_contexts));
- _handle=epoll_create(EPOLL_SIZE);
- if(_handle==-1)
- {
- glog.log(__FUNCTION__,"Epoll create error,errno is %d",errno);
- return false;
- }
- else
- return true;
- }
- void handle_events()
- {
- for(int i=0;i<_lastntfd;i++)
- {
- on_event(_events[i].data.fd,_events[i].events);
- }
- }
- int get_online_users()
- {
- int result=0;
- for(int i=0;i<EPOLL_CONTEXT_SIZE;i++)
- {
- if(_contexts[i]!=0)
- result++;
- }
- return result;
- }
- public:
- bool add(int fd,unsigned int events)
- {
- epoll_event polevt;
- polevt.events=events;
- polevt.data.fd=fd;
- return ctl(EPOLL_CTL_ADD,fd,polevt)==0;
- }
- bool del(int fd,unsigned int events)
- {
- epoll_event polevt;
- polevt.events=events;
- polevt.data.fd=fd;
- return ctl(EPOLL_CTL_DEL,fd,polevt)==0;
- }
- bool modify(int fd,unsigned int events)
- {
- epoll_event polevt;
- polevt.events=events;
- polevt.data.fd=fd;
- return ctl(EPOLL_CTL_MOD,fd,polevt)==0;
- }
- int poll(int timeout=5000)
- {
- _lastntfd=epoll_wait(_handle,_events,EPOLL_SIZE,timeout);
- return _lastntfd;
- }
- protected:
- int ctl(int op, int fd, struct epoll_event &event)
- {
- int ret=epoll_ctl(_handle,op,fd,&event);
- if(ret!=0)
- {
- glog.log(__FUNCTION__,"epoll_ctl fail,op is %d,fd is %d,errno is %d",op,fd,errno);
- }
- return ret;
- }
- protected:
- static bool setnonblocking(int sock)
- {
- int opts;
- opts=fcntl(sock,F_GETFL);
- if(opts<0)
- opts=O_NONBLOCK;
- else
- opts = opts|O_NONBLOCK;
- if(fcntl(sock,F_SETFL,opts)<0)
- {
- glog.log(__FUNCTION__,"setnoblock error");
- return false;
- }
- else
- return true;
- }
- static bool setreuseport(int sock)
- {
- int on=1;
- int ret=setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(int));
- return ret!=-1;
- }
- protected:
- virtual void on_event(int fd,int events){}
- private:
- int _handle;
- epoll_event _events[EPOLL_SIZE];
- int _lastntfd;
- protected:
- EPollerContext _contexts[EPOLL_CONTEXT_SIZE];
- EPollerContext get_context(int value)
- {
- return _contexts[value];
- }
- bool set_context(int value,EPollerContext context)
- {
- _contexts[value]=context;
- }
- };
- class ExampleServer : public Epoller
- {
- public:
- bool init();
- void fini();
- void check_timeout();
- protected:
- void on_event(int fd,int events);
- private:
- void add_newsock(int sockvalue);
- void remove_sock(int sockvalue);
- private:
- int _listen_handler;
- };
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include "server.h"
- #include "clientmanager.h"
- bool ExampleServer::init()
- {
- this->create();
- _listen_handler=socket(AF_INET,SOCK_STREAM,0);
- setnonblocking(_listen_handler);
- setreuseport(_listen_handler);
- sockaddr_in serveraddr;
- memset(&serveraddr,0,sizeof(serveraddr));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
- serveraddr.sin_port=htons(ITEMLIST_SERVER_PORT);
- bind(_listen_handler,(sockaddr *)&serveraddr, sizeof(serveraddr));
- listen(_listen_handler,ITEMCOMMENT_SERVER_LISTEN_BACKLOG);
- this->add(_listen_handler,EPOLLIN|EPOLLOUT);
- this->set_context(_listen_handler,0);
- }
- void ExampleServer::fini()
- {
- close(_listen_handler);
- }
- void ExampleServer::add_newsock(int sockvalue)
- {
- if(sockvalue>EPOLL_CONTEXT_SIZE)
- {
- glog.log(__FUNCTION__,"newsock is %d,> %d",sockvalue,EPOLL_CONTEXT_SIZE);
- close(sockvalue);
- return;
- }
- ClientSession *newsession=gClientManager.alloc_client_session(sockvalue);
- if(newsession==NULL)
- {
- close(sockvalue);
- return;
- }
- if(add(sockvalue,EPOLLIN|EPOLLOUT))
- {
- this->set_context(sockvalue,newsession);
- }
- else
- {
- gClientManager.release_client(newsession);
- close(sockvalue);
- }
- }
- void ExampleServer::remove_sock(int sockvalue)
- {
- this->del(sockvalue,0);
- close(sockvalue);
- ClientSession *client=(ClientSession *)this->get_context(sockvalue);
- if(client)
- {
- gClientManager.release_client(client);
- }
- this->set_context(sockvalue,0);
- }
- void ExampleServer::on_event(int fd,int events)
- {
- if(fd==_listen_handler)
- {
- sockaddr_in sa;
- memset(&sa,0,sizeof(sa));
- socklen_t salen=sizeof(sa);
- int newsock=accept(_listen_handler,(sockaddr *)&sa,&salen);
- if(newsock>0)
- {
- add_newsock(newsock);
- }
- }
- else
- {
- ClientSession *client=(ClientSession *)this->get_context(fd);
- if(client!=NULL)
- {
- int newevents=client->handle_events(fd,events);
- if(newevents==0)
- {
- remove_sock(fd);
- }
- else
- this->modify(fd,newevents);
- }
- }
- }
- void ExampleServer::check_timeout()
- {
- unsigned int curtime=time(NULL);
- for(int i=0;i<EPOLL_SIZE+256;i++)
- {
- ClientSession *client=(ClientSession *)this->get_context(i);
- if(client!=NULL)
- {
- if(curtime-client->get_last_io_time()>ITEMINDEX_SERVER_MAX_TIMEOUT)
- {
- remove_sock(i);
- }
- }
- }
- }
发表评论
-
New Enterprise Security Solutions
2011-09-13 15:46 0<!-- [if !mso]> <styl ... -
ES Announces Enterprise Security Solutions
2011-09-13 15:40 0<!-- [if !mso]> <styl ... -
linux下如何将文件打包、压缩并分割成制定大小?
2010-09-15 18:52 3318将大文件或目录打包、 ... -
rhel4 yum安装, 使用
2010-09-07 16:37 0第一种方法: yum源来自chinalinuxpub.com ... -
Windows: 远程自动安装程序
2010-08-26 15:48 1111问题的提出 作为 ... -
Oracle体系结构
2010-08-07 09:53 1045Oracle体系结构 Oracle Server包括Oracl ... -
ocp sesson 3
2010-07-31 14:39 0show parameter undo 只有 默认情况下服务 ... -
ocp session 2
2010-07-25 17:00 0/home/oracle/raInventory/orains ... -
ocp session 1
2010-07-24 13:02 0ocp first lesson D:\oracle_cou ... -
Python的xmlrpc调试
2010-07-19 23:55 2134Python的xmlrpc 调 试 ----------- ... -
mdadm使用详解及RAID 5简单分析
2010-07-11 16:19 1400http://blog.csdn.net/chinalinux ... -
Linux的lvm的基本配置步骤
2010-07-11 14:53 12911.增加硬件 增加的ide硬盘前缀为hd,scs ... -
OCP study material
2010-07-11 13:52 0\\192.168.1.105watch -n 1 'stat ... -
apache+python+mod_python+django 编译安装指南
2010-06-24 17:25 14771、本文将知道你在 linux 下使用源码包安装 ... -
在ubuntu下配置apache运行python脚本
2010-06-22 16:11 2282常用的简单命令 sudo apt ... -
Python 2.5 Quick Reference
2010-06-21 11:18 1473... -
shell 面试题汇集
2010-06-10 19:50 1068利用 top 取某个进程的 CPU 的脚本 : ... -
shell程序面试题
2010-06-10 19:48 29401.要求分析Apache访问日志,找出里面数量在前面100位的 ... -
EMC技术支持工程师笔试部分试题回忆
2010-06-07 15:16 1658要查看更多EMC公司笔经相关信息,请访问EMC公司校园招聘CL ... -
linux shell 条件语句
2010-06-03 23:29 1803...
相关推荐
ACE_Proactor是ACE库中的一个核心组件,它提供了一种异步事件处理机制,使得开发者可以编写非阻塞的、高性能的网络应用。这个压缩包包含的是一组使用ACE_Proactor实现TCP通信的示例代码,我们可以从这些文件中学习到...
**Windows下的IOCP(I/O完成端口)与ACE Proactor框架** IOCP(I/O完成端口,Input/Output Completion Port)是Windows操作系统提供的一种高效、可扩展的异步I/O模型。它允许应用程序处理大量的并发I/O操作,特别...
ACE_Proactor是一个高级事件处理库,它为C++程序员提供了异步I/O操作的抽象,包括TCP协议的网络通信。这个示例代码是关于...通过理解和应用这些示例代码,你可以学习到如何使用ACE库来构建高效、健壮的TCP通信系统。
"ACE通用服务器ace server"是一个基于ACE库构建的服务器架构,它涵盖了两种核心的设计模式:Reactor和Proactor。这两个模式在并发编程和网络服务领域中具有重要地位,特别是对于高性能、高并发的服务器开发至关重要...
ACE Proactor模式适用于高并发、低延迟的应用场景,如实时交易系统、大规模在线游戏服务器、分布式计算等。封装后的接口使其更易于在这些领域中快速开发和部署。 7. **注意事项** 尽管封装简化了使用,但理解异步...
《C++网络编程(卷2) 基于ACE和框架的系统化复用》是深入探讨C++在网络编程领域的经典之作,尤其注重利用ACE框架实现高效、可复用的系统设计。这本书主要涵盖了以下几个核心知识点: 1. **ACE框架**:ACE(Adaptive ...
《ace技术内幕:深入解析ace架构设计与实现原理》从构架模式、编程示例和源代码3个维度系统地对经典网络框架ace(adaptivemunicationenvironment)的架构设计和实现原理进行了深入分析,它能解决4个方面的问题:,...
5. **网络编程实战**:通过实例演示如何使用ACE解决实际问题,如服务器端的设计、客户端的实现、异常处理等。 6. **性能优化和测试**:讨论网络应用的性能评估和优化策略,以及如何进行压力测试。 阅读这两卷书籍...
本人学习ACE 时候写的关于两种通信方式的实例代码,我把三个连写都写在了一个文件,根据需要注释掉其他的就行。 ACE用于开发通信程序非常方便,尤其相对于WinSock 来说,可以省很多代码,普通程序员也更容易理解
ACE(Adaptive Communication Environment)是一种跨平台的网络编程框架,专为分布式实时和嵌入式系统设计。这个压缩包包含了关于ACE技术的详尽文档和实际应用的例子,可以帮助开发者深入理解并有效地使用ACE进行...
这套书籍深入探讨了如何使用C++进行高效的网络编程,特别是利用ACE库来简化复杂性的处理。以下是这些书籍中的核心知识点: 1. **C++网络编程 卷1 - 运用ACE和模式消除复杂性**: - **ACE库介绍**:ACE是一个跨平台...
《网络编程+卷2+基于ACE和框架的系统化复用》是一本深入探讨网络编程技术的书籍,尤其关注如何利用ACE(Adaptive Communication Environment)框架实现高效、可靠的系统化复用。ACE是一个开源的C++库,专门设计用于...
1. **ACE框架**:ACE是一个开源的C++库,设计用于解决分布式系统和并发编程中的复杂性问题。它提供了许多预构建的组件,如线程管理、信号处理、事件调度、I/O复用、网络编程接口等,帮助开发者快速构建可移植的应用...
《C++网络编程 卷2 基于ACE和框架的系统化复用》是一本深入探讨C++网络编程的专业书籍,主要关注如何利用ACE(Adaptive Communication Environment)框架进行高效、可复用的系统开发。ACE是一个强大的、跨平台的C++...
ACE(Adaptive Communication Environment)是一个跨平台的C++网络编程框架,它提供了高效、可靠且灵活的网络通信解决方案。这个“ACE学习文档大全.rar”压缩包文件包含了丰富的资源,可以帮助初学者快速入门并深入...
本主题主要围绕"ACE并发编程示例及Task类的实现"展开,我们将深入探讨并发编程的概念以及如何利用ACE框架中的ACE_Task类来实现并发任务。 并发编程是让多个任务或进程在一段时间内交替执行,从而提高系统资源利用率...
* 网络服务器:Reactor 和 Proactor 模式可以用于设计高效的网络服务器,处理大量的网络请求。 * 网络客户端:Reactor 和 Proactor 模式可以用于设计高效的网络客户端,处理网络请求和响应。 * 分布式系统:Reactor ...
对于期望深入学习和掌握C++网络编程的开发者来说,本书提供了一套完善的理论体系和实践指南,通过学习ACE框架的应用,可以有效提升网络编程的技能,并且能够掌握如何在复杂的网络和分布式系统中实现高效的代码重用。...
这个RAR压缩包中的资源,"ACE.chm",是一部关于ACE网络编程的开发说明文档,特别适合初学者入门学习。通过这份文档,你可以深入理解ACE的核心概念和技术,并学会如何在Visual C++环境下进行实际的网络编程。 一、...
ACE框架包含了许多核心组件,如Acceptor-Connector设计模式、Reactor模式、Proactor模式,这些都是实现异步事件驱动编程的关键元素。 "用户指南"将引导你如何有效地使用ACE框架。它通常会涵盖安装步骤、配置环境、...