找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3490|回复: 7

关于句柄及其他的一些问题,请指教

[复制链接]
发表于 2009-3-31 09:34:50 | 显示全部楼层 |阅读模式
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 还没有被自动回调,那该怎么办让他自动回调呢~~

谢谢~~~ 请指点一下~~~
发表于 2009-3-31 10:20:37 | 显示全部楼层
1.可以考虑,用一个容器保存预先生成好的Service_handler列表,可以认为是连接池。
然后每次连接用完了之后,不关闭,比如设置一个标志false,
再次有连接过来的时候,在asyn_acceptor的make_handler方法处,
检查容器,如果标志为false即可以将该连接返回。
程序结束时,所有handler,需要统一调用关闭接口。
基本上可以实现你的设想,不过具体应用时还是有很多问题需要考虑的,
比如连接池用尽以后的扩充策略等等。
2.close_socket() 没看出什么问题,和我用的差不多。
3.记得ace里有一个关于引用计数的例子,应该可以解决你提到的close_cocket的时机的问题。
 楼主| 发表于 2009-3-31 11:24:44 | 显示全部楼层

回复 #2 modern 的帖子

可是说什么过一段时间内存在增加呢,每次都增加4K,可能会是什么问题呢?

还有出现过 handle_write_stream 没有回调的问题,可能是什么原因造成的呢?

谢谢~~
 楼主| 发表于 2009-3-31 11:25:27 | 显示全部楼层
能告诉我引用计数的例子在哪吗? 谢谢~~
发表于 2009-3-31 12:03:18 | 显示全部楼层
内存增长的问题恐怕就得具体问题具体分析了,
基本上应该都是自己编码造成的内存泄露。

引用计数的例子,印象里是c++np2上看到的,
要不好像就是以前看&(ACE_ROOT)\examples\reactor下面的例子看到的。
我也记得不清楚了,不保证一定能找到。
发表于 2009-3-31 16:24:28 | 显示全部楼层
&(ACE_ROOT)\examples\C++NPv2\C++NPv2_TPLS_vc8.vcproj
可以参考一下,虽然以reactor为实现的,
不过在Proactor上稍微改动一下就应该可以了。
 楼主| 发表于 2009-3-31 17:08:34 | 显示全部楼层

回复 #6 modern 的帖子

thanks~~~
这就去看看~~~
 楼主| 发表于 2009-4-1 11:38:51 | 显示全部楼层

关于自动回调的问题,请指教~~~

昨天问的问题还是有相关的没有太弄明白,请多指点指点~~~

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 完成呢?
请高人们指教一下~~~~ 谢谢~~~~~~
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 03:22 , Processed in 0.015306 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表