正如几位高手所说,数据必须要打包发送,自己定一个协议,以解包和打包
现在这个过程中遇到如下难题:先贴代码上来,再慢慢看问题:
//发送函数,参数中容器fcls和objs中装的就是要传送的数据,是需要发送的数据
//设计为先发送fcls再发送objs
//初步决定4KB为一个包发送,所以涉及到打包问题,以fcls为例每个fcls前加一个包头,其中有flag和数据长度
int CommunicationServer::sendData(std::vector<FeatureClassPtr> &fcls,std::vector<Feature*> &objs)
{
//先发送fcls ,每个数据段前加一个包头,格式为:flag(f/o) + length
char packHead[5] = "f";
for(std::vector<FeatureClassPtr>::iterator i = fcls.begin();i != fcls.end();++i)
{
//....
//得到flcs中的数据buf
//....
size_t *pb = (size_t *)(packHead+1); //写好包头中的length
*pb = buf->size();
ACE_Message_Block *mb;
ACE_NEW_RETURN(mb, ACE_Message_Block(4096), -1);
if (-1 == mb->copy((const char *)packHead,5)) //写包头
{
size_t ncoun_left = mb->space();
mb->copy((const char *)packHead,ncoun_left);
initWriteStream(*mb,4096);
}
else
{
if (-1 == mb->copy((const char*)buf->begin(),buf->size())) //写具体数据
{
size_t ncount_left = mb->space();
mb->copy((const char *)buf->begin(),ncount_left);
initWriteStream(*mb,4096);
}
}
//上述代码中有很大问题,其一,把mb声明放循环里面,每循环一次,申请一个mb,显然不能达到打包的效果
//其二,把mb声明放循环外面,那当打好一个包后,又不能把它release掉,还是不能打包
//其三,先计算所有要发送的数据总长,要打包多少,然后定义一个mb 数组,一个一个用掉。。。方案看似可行,但过于复杂
请问高手,如何解决这种Proactor 的打包问题。。。。 |