jerry0715 发表于 2008-3-5 10:57:04

关于前摄器异步写的问题

我用前摄器模式写一个支持下载服务器的demo,调式的时候发现服务器返回not enough space的代码,但是数据仍然传给了客户端,
以下是我的代码:

//从segment中获取数据,可能通过startPoint和data_count截取部分数据
   writeMB =SMovieInfo::instance()->getSegmentContent(data_bulkID,data_segmentID,data_startPoint,data_count);
   ACE_Message_Block *head;
   ACE_OutputCDR outCDR(ACE_CDR::MAX_ALIGNMENT+8);
   outCDR<<ACE_OutputCDR::from_boolean(ACE_CDR_BYTE_ORDER);
   if (writeMB == NULL)
   {   
    data_count = 0;
   }
   
   outCDR<<ACE_CDR::ULong(data_count);
    //用两个ACE_Message_Block串联
   if (writeMB!=NULL)
   {
    head = new ACE_Message_Block((outCDR.begin())->rd_ptr(),(outCDR.begin())->total_length());
    head->wr_ptr((outCDR.begin())->total_length());
    head->cont(writeMB);
   }
   
   unsigned long resultsize = head->total_length();
   if (this->writer_.writev(*head,resultsize)!=0)
   {
    ACE_ERROR((LM_ERROR,ACE_TEXT("%p\n"),ACE_TEXT("starting write")));
   }

客户端请求的数据包大小是823136+8,服务器的两个ace_message_block包大小一个是8,一个是823136,发送出去产生 starting write:no enough space的错误
请问我该如何处理,是否需要将异步write每次写的数据减小,而不是这样一次发送800KB的数据呢。
初学者,请大家赐教,谢谢

peakzhang 发表于 2008-3-5 22:13:17

不太好分析。
1、是否打开了太多的异步投递。ACE默认的那个数字,是有问题的。改小点。
2、仔细分析一下代码,查看一下内存变化,看看是否有错误。

jerry0715 发表于 2008-3-6 15:09:06

1、是否打开了太多的异步投递。ACE默认的那个数字,是有问题的。改小点。
版主你说的这个参数是在哪里更改的。

问题解决了,但是还是不知道为什么,将writev调用通过类成员writeFlag_ 来调用两次异步写,先写8个字节的头,然后再写二进制内容的MessageBlock,就不会出现
上面说的错误。没有通过自己控制wr_ptr()指针使得每次异步写的包内容小于1500。

版主说的打开了太多的异步投递,还没有做压力测试,暂时用一个客户端连接试试功能性。

感谢版主的建议,谢谢
void Download_Service::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result)
{
if (writeFlag_ == 1)
{
writeFlag_ = 2; //如何判断写操作正确,如果分组写,不正确就立刻返回而不进行接下来的操作
result.message_block().release();
if (this->writer_.write(*writeMB,writeMB->total_length())!=0)
{
   ACE_ERROR((LM_ERROR,ACE_TEXT("%p\n"),ACE_TEXT("starting write")));
}
}
else
{
result.message_block().release();
delete this;
return;
}

}
页: [1]
查看完整版本: 关于前摄器异步写的问题