关于句柄及其他的一些问题,请指教
class ServerHander :public ACE_Service_Handler{
void ServerHander::open(ACE_HANDLE h, ACE_Message_Block& _mb)
{
this->handle(h);
......
}
int ServerHander::close_socket()
{
m_reader.cancel();
m_writer.cancel();
if (this->handle() != ACE_INVALID_HANDLE)
{
ACE_OS::shutdown(this->handle(),SD_BOTH);
ACE_OS::closesocket( this->handle() );
this->handle(ACE_INVALID_HANDLE);
}
return 0;
}
}
想向各位高人问一下,
我想每次把处理器用完后不释放掉,而是回收,等下次再用,我得到 句柄 h 以后 ,
我用 close_socket() 释放他,能完全释放掉句柄所占用的资源吗?如果不能该怎么释放呢?
还有如果不直接释放这个处理器而是等待下次再利用,有没有需要注意的地方,我发现我的东西有的地方有内存泄露(老是 4K 的增长),又不知道在哪儿,有没有注意的地方,请指点一下。
如果在写信息后,正要调用 handle_write_stream 而此时调用了 close_socket(), 那么
handle_write_stream 还会自动回调吗?因为我里出现了在写返回成功后,我就继续读操作,可是没有再读的了,就在 handle_read_stream 里关闭了,而有些时候发现 handle_write_stream 还没有被自动回调,那该怎么办让他自动回调呢~~
谢谢~~~ 请指点一下~~~ 1.可以考虑,用一个容器保存预先生成好的Service_handler列表,可以认为是连接池。
然后每次连接用完了之后,不关闭,比如设置一个标志false,
再次有连接过来的时候,在asyn_acceptor的make_handler方法处,
检查容器,如果标志为false即可以将该连接返回。
程序结束时,所有handler,需要统一调用关闭接口。
基本上可以实现你的设想,不过具体应用时还是有很多问题需要考虑的,
比如连接池用尽以后的扩充策略等等。
2.close_socket() 没看出什么问题,和我用的差不多。
3.记得ace里有一个关于引用计数的例子,应该可以解决你提到的close_cocket的时机的问题。
回复 #2 modern 的帖子
可是说什么过一段时间内存在增加呢,每次都增加4K,可能会是什么问题呢?还有出现过 handle_write_stream 没有回调的问题,可能是什么原因造成的呢?
谢谢~~ 能告诉我引用计数的例子在哪吗? 谢谢~~ 内存增长的问题恐怕就得具体问题具体分析了,
基本上应该都是自己编码造成的内存泄露。
引用计数的例子,印象里是c++np2上看到的,
要不好像就是以前看&(ACE_ROOT)\examples\reactor下面的例子看到的。
我也记得不清楚了,不保证一定能找到。 &(ACE_ROOT)\examples\C++NPv2\C++NPv2_TPLS_vc8.vcproj
可以参考一下,虽然以reactor为实现的,
不过在Proactor上稍微改动一下就应该可以了。
回复 #6 modern 的帖子
thanks~~~这就去看看~~~
关于自动回调的问题,请指教~~~
昨天问的问题还是有相关的没有太弄明白,请多指点指点~~~class ServerHander :public ACE_Service_Handler
{
......
if (this->m_writer.write( *mb,mb_length ) != 0)
{
cout<<"Server write failed..."<<endl;
mb->release();
return -1;
}
else
{
if( this->m_reader.read( *mba,mba_length ) != 0 )
{
mba->release();
return -1;
}
}
}
如果我在某一段中调用了写操作,按理说应该回调 handle_write_stream,可是成功后 我又开始读操作了,读完后自动回调handle_read_stream,如果已经回调了 handle_read_stream ,而handle_write_stream还没有被回调,而此时,发现已经应该关闭该连接了,那么我就在handle_read_stream 里关闭连接,可是我想问的是,如果我在handle_read_stream 里要等待handle_write_stream 回调完才该关闭,那么 handle_read_stream 和 handle_write_stream 是不是在同一个线程里执行呢,如果是,那我怎么在 handle_read_stream 里等都不可能完成的呀? 如果不能完成,那么我应该在哪里等待 handle_write_stream 完成呢?
请高人们指教一下~~~~ 谢谢~~~~~~
页:
[1]