liforget_bain 发表于 2010-9-14 19:27:01

ACE初学者的一个问题,这是缓冲区溢出的问题么?

这段代码片段,
AIO_Input_Handler .h
class AIO_Input_Handler : public ACE_Service_Handler
{
public:
        AIO_Input_Handler(AIO_CLD_Acceptor *acc=0):acceptor_ (acc),mblk_ (0){}
        virtual ~AIO_Input_Handler();

        virtual void open(ACE_HANDLE new_handle,ACE_Message_Block &message_block);

        virtual void addresses(const ACE_INET_Addr &remote_address, const ACE_INET_Addr &local_address);

        int initWriteStream(ACE_Asynch_Write_Stream *ws);
       
        AIO_CLD_Acceptor *acceptor_;
       
        ACE_Message_Block *mblk_;

        ACE_Asynch_Write_Stream write_;
       
        ACE_Asynch_Read_Stream reader_;

        virtual void handle_read_stream(const ACE_Asynch_Read_Stream::Result &result);
        virtual void handle_write_stream(const ACE_Asynch_Write_Stream::Result &result);

        ACE_INET_Addr remote_address_save;
        ACE_INET_Addr local_address_save;
        ACE_TCHAR peer_name;
       

};

AIO_Input_Handler .cpp

void AIO_Input_Handler::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result)
{
        while(true)
        {
                  
                                  ACE_NEW_NORETURN(mblk_,ACE_Message_Block(TEST_PACKET_LEN));//TEST_PACKET_LEN长度为512
                  mblk_->copy((char*)TestPacket,TEST_PACKET_LEN);
                           if(this->write_.write(*mblk_,mblk_->length())!=0)
                {
                        printf("错误");
                        mblk_->release();
                                                break;
                   }
                   else{
                        mblk_->release();
                        printf("发送成功");
                   }
         }
}

本来是想每次客户端接进来,利用循环发送1000条消息给客户端,后来发现在while循环中,不断的异步write,会出现内存不断增加,一开始以为是ACE_Message_Block的关系,后来发现不是,因为光COPY()和release()内存不会增加,而往往异步write后,内存直线上升,难道这是SOCKET的缓冲区溢出么?难道ACE的异步写没有解决缓冲区溢出的问题么?不太明白,有什么办法可以解决啊?比如在write前如何得知缓冲区是否已满啊?请各位教教我。

liforget_bain 发表于 2010-9-14 21:35:15

没人帮我解答么?:'(

modern 发表于 2010-9-15 13:18:41

ACE_Asynch_Read_Stream::Result &result
用完了要释放的

liforget_bain 发表于 2010-9-15 18:41:49

ACE_Asynch_Read_Stream::Result &result
用完了要释放的
modern 发表于 2010-9-15 13:18 http://www.acejoy.com/bbs/images/common/back.gif


我是这样释放的,难道不行么?
void HA_Proactive_Service::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result)
{

    ACE_Message_Block &mb = result.message_block ();
    mb.release();

        //result.message_block().release();
   return;
}

wuyuexiaobai 发表于 2010-9-15 21:11:57

你是一个线程,还是?
一个线程的话handle_read_stream中你不断的调用write_.write(*mblk_,mblk_->length());没让其返回,
handle_write_stream没法回调所以你的mblk_根本就没释放,内存怎么能不增呢...

liforget_bain 发表于 2010-9-16 11:04:56

你是一个线程,还是?
一个线程的话handle_read_stream中你不断的调用write_.write(*mblk_,mblk_->length() ...
wuyuexiaobai 发表于 2010-9-15 21:11 http://www.acejoy.com/bbs/images/common/back.gif

多线程的,应该不是没释放的原因,我将发送速度Sleep(500),内存便不再增加了,我觉得应该是OS socket缓冲区溢出的问题,但又不能确定,谁知道如何获取缓冲区大小和已经使用的大小啊?我想在handle_write_stream中获取缓冲以用大小,找便了都没有,那个get_option和set_option就是搞不明白,就是另外有一个很不理解的,就是这个缓冲区的大小是所有套接字所有客户端共享的还是OS为每个套接字每个客户端都分配一个独立的缓冲区啊?

liforget_bain 发表于 2010-9-16 11:05:13

谁知道如何获取缓冲区大小和已经使用的大小啊?我想在handle_write_stream中获取缓冲以用大小,找便了都没有,那个get_option和set_option就是搞不明白,就是另外有一个很不理解的,就是这个缓冲区的大小是所有套接字所有客户端共享的还是OS为每个套接字每个客户端都分配一个独立的缓冲区啊?

freeeyes 发表于 2010-9-16 14:00:57

write后,你的 handle_write_stream()是怎么处理的?

liforget_bain 发表于 2010-9-16 20:44:12

write后,你的 handle_write_stream()是怎么处理的?
freeeyes 发表于 2010-9-16 14:00 http://www.acejoy.com/bbs/images/common/back.gif

仅仅只是:
void AIO_Input_Handler::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)
{
       
        result.message_block().release();
        return ;
}

liforget_bain 发表于 2010-9-19 05:47:34

你是一个线程,还是?
一个线程的话handle_read_stream中你不断的调用write_.write(*mblk_,mblk_->length() ...
wuyuexiaobai 发表于 2010-9-15 21:11 http://www.acejoy.com/bbs/images/common/back.gif

兄弟,你真是聪明过人啊,我找到问题所在了,我虽然使用多线程,但是对于继承的ACE_Service_Handler只是单一线程,也就handle_read_stream只是一个线程,其他线程都是逻辑处理线程,而在继承的ACE_Service_Handler又使用了for循环,不断的向逻辑线程put消息,逻辑线程get消息后又不断调用ACE_Service_Handler的处理器指针进行write消息,也就是大概上向你说的那样,在ACE_Service_Handler中的一条线程始终卡在了for循环内了啊,怎么能有空调用释放呢!内存不增加反倒奇怪了,呵呵。问题的根本上就是我没理解这个ACE_Service_Handler到底是个什么东西,原来有几个ACE_Service_Handler线程就有几个线程在完成端口上等待是吧?而ACE_Service_Handler的 OPEN()所得到连接上来的客户端的处理器共用这几个ACE_Service_Handler线程,而且ACE_Service_Handler线程可以是一个或多个,而ACE_Service_Handler得到的客户端处理器并不是由ACE_Service_Handler线程决定的,不知道我理解的有没有错啊?请再指点一二,谢谢。
页: [1]
查看完整版本: ACE初学者的一个问题,这是缓冲区溢出的问题么?