一动不如一静
C++博客
首页
新随笔
联系
聚合
管理
20 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
ACE(10)
C++(9)
Design patter
life(13)
snmp++
tool
随笔档案
2008年2月 (1)
2007年5月 (1)
2007年3月 (2)
2007年2月 (3)
2006年12月 (2)
2006年10月 (2)
2006年6月 (9)
相册
2007年夜饭
书柜
学习资源
各种软件下载
搜索
最新评论
1. re: 关于ACE_TP_Reactor
评论内容较长,点击标题查看
--aa
2. re: 如何根据crash地址找到对应的行号
查看堆栈不就完了。。。
--等等
3. re: error LNK2019:无法解析的外部符号
不错,学习了
--创意家居
4. re: 如何根据crash地址找到对应的行号
你这个办法不太好用啊,比如在程序里面用了个strcpy出错了,出错的地址
最后就映射到strcpy.asm里面去了,怎么知道是在主程序的什么地方调用了
strcpy阿
--mikey
5. re: 如何根据crash地址找到对应的行号
这个还是有点专业哦,能不能来一个再详细点的哦,方首页让大家一起学习了!
--梦在天涯
阅读排行榜
1. error LNK2019:无法解析的外部符号(26279)
2. 如何用windug分析dump文件(还原堆栈信息)(4919)
3. window上如何设置才能获取dump文件(3920)
4. 关于ACE_TP_Reactor(3082)
5. TP_Reactor 学习笔记(2244)
评论排行榜
1. error LNK2019:无法解析的外部符号(5)
2. 如何根据crash地址找到对应的行号(3)
3. 关于MPC的问题收集(1)
4. 关于ACE_TP_Reactor(1)
5. 异步I/O(0)
N个Reactor是否就意味着支持N*FD_SETSIZE个连接呢?
/**/
/*
*******************************************************************
* Copyright (c) 2006,study-record home
* All rights reservered.
*
* 文件名称 : littersize.cpp
* 摘 要 : 这个例子主要是用来验证这样一个问题。当我们程序中有n个reactor的时候,是否就意味着我们支持n*FD_SETSIZE连接.
为了验证这个问题,我们传递一个大小为2的值给ACE_Select_Reactor的构造函数。看是否是只支持2个连接?
验证结果表明:在本例子中,由于acceptor注册用掉了一个,而我们给定的最大的handle数为2,所以只能接受一个连接。
在命令行下输入:telnet 127.0.0.1 1234 ,在我们第二次输入时,
在调用int nRet = m_Reactor->register_handler(pEvent, ACE_Event_Handler::READ_MASK);的时候一定会失败。
但是在命令行下输入:telnet 127.0.0.1 2345 ,在我们第三次输入的时候,调用register_handler的时候才会失败
但是这样的一段代码存在高cpu的问题,也就是当把客户端关调的时候,cpu占用率会很高?想想看,为什么呢?
本代码只是为了验证一些东西,有很多不合理的地方,请务仿照。
*
* 当前版本 : 1.0
* 作 者 : study-record 2007-2-22
*
********************************************************************
*/
#include
"
ace/Thread_Manager.h
"
#include
"
ace/Select_Reactor.h
"
#include
"
ace/Reactor.h
"
#include
"
ace/Event_Handler.h
"
#include
"
ace/SOCK_Acceptor.h
"
#include
"
ace/SOCK_Stream.h
"
#include
"
ace/INET_Addr.h
"
const
size_t g_unOneMaxHandle
=
2
;
const
size_t g_unTwoMaxhandle
=
4
;
static
ACE_THR_FUNC_RETURN event_loop_one (
void
*
arg)
{
ACE_Reactor
*
reacator
=
static_cast
<
ACE_Reactor
*>
(arg);
reacator
->
owner(ACE_Thread::self());
reacator
->
run_reactor_event_loop();
return
0
;
}
static
ACE_THR_FUNC_RETURN event_loop_two (
void
*
arg)
{
ACE_Reactor
*
reacator
=
static_cast
<
ACE_Reactor
*>
(arg);
reacator
->
owner(ACE_Thread::self());
reacator
->
run_reactor_event_loop();
return
0
;
}
class
TestHandleEvent:
public
ACE_Event_Handler
{
public
:
virtual
int
handle_input (ACE_HANDLE fd
=
ACE_INVALID_HANDLE)
{
ACE_DEBUG((LM_DEBUG,
"
TestHandleEvent::handle_input\n
"
));
return
0
;
}
;
virtual
int
handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
ACE_DEBUG((LM_DEBUG,
"
TestHandleEvent::handle_close\n
"
));
delete
this
;
return
0
;
}
;
ACE_HANDLE get_handle(
void
)
const
{
return
peer.get_handle();
}
public
:
ACE_SOCK_Stream peer;
}
;
class
TestAcceptor :
public
ACE_Event_Handler
{
public
:
virtual
int
handle_input (ACE_HANDLE fd
=
ACE_INVALID_HANDLE)
{
TestHandleEvent
*
pEvent
=
new
TestHandleEvent;
acceptor.accept(pEvent
->
peer);
int
nRet
=
m_Reactor
->
register_handler(pEvent, ACE_Event_Handler::READ_MASK);
if
(
-
1
==
nRet)
{
delete pEvent;
pEvent
=
NULL;
}
return
0
;
}
;
virtual
int
handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
{
ACE_DEBUG((LM_DEBUG,
"
TestAcceptor::handle_close\n
"
));
acceptor.close();
delete
this
;
return
0
;
}
;
TestAcceptor(ACE_Reactor
*
reactor):m_Reactor(reactor)
{
}
;
int
open(unsigned
short
usport)
{
ACE_INET_Addr addr(usport);
acceptor.open(addr);
return
m_Reactor
->
register_handler(
this
, ACE_Event_Handler::ACCEPT_MASK);
}
;
ACE_HANDLE get_handle(
void
)
const
{
return
acceptor.get_handle();
}
public
:
ACE_SOCK_Acceptor acceptor;
ACE_Reactor
*
m_Reactor;
}
;
int
main (
int
argc,
char
*
argv[])
{
ACE_Select_Reactor select_reactor_one(g_unOneMaxHandle,
0
,
0
,
0
,
1
);
ACE_Reactor
*
reactor_one
=
new
ACE_Reactor(
&
select_reactor_one);
ACE_Select_Reactor select_reactor_two(g_unTwoMaxhandle,
0
,
0
,
0
,
1
);
ACE_Reactor
*
reactor_two
=
new
ACE_Reactor(
&
select_reactor_two);
TestAcceptor test_acceptor(reactor_one);
test_acceptor.open(
1234
);
TestAcceptor test_acceptorw(reactor_two);
test_acceptorw.open(
2345
);
ACE_Thread_Manager::instance()
->
spawn(event_loop_one, reactor_one);
ACE_Thread_Manager::instance()
->
spawn(event_loop_two, reactor_two);
return
ACE_Thread_Manager::instance()
->
wait();
}
posted on 2007-02-22 23:25
一动不如一静
阅读(828)
评论(0)
编辑
收藏
引用
所属分类:
ACE
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
TP_Reactor 学习笔记
select_reactor的原码学习笔记
N个Reactor是否就意味着支持N*FD_SETSIZE个连接呢?
异步I/O
关于ACE_TP_Reactor
关于MPC的问题收集
网络编程卷2 ACE_WFMO_Reactor的并发考虑
ACE的相关的几个网址
非阻塞Acceptor的动机
error LNK2019:无法解析的外部符号
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 一动不如一静