关于前摄器异步写的问题
我用前摄器模式写一个支持下载服务器的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的数据呢。
初学者,请大家赐教,谢谢 不太好分析。
1、是否打开了太多的异步投递。ACE默认的那个数字,是有问题的。改小点。
2、仔细分析一下代码,查看一下内存变化,看看是否有错误。 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]