问题记录:可变缓冲区问题

网络传输存在的一个问题是,当消息发送速度非常快(比如1s发送200个数据包)时,缓冲区可能会填满而导致发送队列后面的数据发送失败
因此试图通过建立可变缓冲区
当数据发送速度非常快时,马上扩充缓冲区容量,使其适应数据的发送数率

通过动态数组来实现一个动态循环队列的数据缓冲区
std::vector<DataItem> *_dataQueue;

调试中发现一个问题,就是从缓冲区取出的数据次序与送入次数不一致性

原因:
首先往缓冲区依次填入数据
数据包所在位置依次为:
前面的表示缓冲区的位置(为方便,从1开始计数),括号里表示发送包的编号

1(1) 2(2) 3(3) 4(4) 5(5) 6(6) 7(7) 8(8)
此时另外一个线程取出数据包1(1) 2(2) 3(3)发送;
发送完毕后会停止一段时间
此时循环队列位置Position = 4

此时发送线程继续塞入数据,会先填充位置123,此时缓冲区已满
缓冲区数据依次为:
1(9) 2(10) 3(11) 4(4) 5(5) 6(6) 7(7) 8(8)

于是将缓冲区容量由8扩充至12
继续发送数据
依次填充位置9(12) 10(13) 11(14) 12(15)
填充完毕后,开始取数据
由于循环队列位置Position = 4
那么,此时取数据的顺序变为:
4(4) 5(5) 6(6) 7(7) 8(8) 9(12) 10(13) 11(14) 12(15) 1(9) 2(10) 3(11)


而送入缓冲区的数据包次数为:
4(4) 5(5) 6(6) 7(7) 8(8) 1(9) 2(10) 3(11) 9(12) 10(13) 11(14) 12(15)

两者不一致。

根本原因是:填充数据时是以长度为8的队列在循环,但是取数据的时候则是以一个长度为12的循环队列取数据,次序自然不能保证了。


考虑方法:
1.在扩充容量过程中,将position标号前面的数据包依次拷入扩容的空间,使其与填入缓冲区次序一次。
 也就是在扩容的时候
 将缓冲区中的数据做一次部分移动:
移动前: 1(9) 2(10) 3(11) 4(4) 5(5) 6(6) 7(7) 8(8)
 
移动后: 1(-1) 2(-1) 3(-1) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9) 10(10) 11(11) 12(-1)
(括号里-1表示数据包无效,可以继续放入数据)
 尝试了:速度太慢

2。记录前一次一个缓冲区的大小,先做小队列循环,再做大队列循环。比如说由8扩充至12时,先做一个队列为8的循环,再做一个队列长为12的循环。
  问题是,如果数据速率超快,那么队列长度的变化由8,12,16,32,那么后面的就会覆盖前面的长度。
  又回到根本性的问题:填充数据与取数据的队列长度 不一致。

。。。下班,明天再来想。

还是用方法1解决:
测试代码:

XmlRpcDataBuffer buf;
for ( int i = 0; i < 7; i++ )
{
char s[20];
sprintf(s,"%d",i);
std::string pd = s;
buf.push(pd);
buf.print();
}

std::string data;
buf.get(data);
buf.print();
buf.get(data);
buf.print();
buf.get(data);
buf.print();
for ( int i = 7; i < 13; i++ )
{
char s[20];
sprintf(s,"%d",i);
std::string pd = s;
buf.push(pd);
buf.print();
}

buf.get(data);
buf.print();
buf.get(data);
buf.print();
buf.get(data);
buf.print();
for ( int i = 13; i < 23; i++ )
{
char s[20];
sprintf(s,"%d",i);
std::string pd = s;
buf.push(pd);
buf.print();
}



结果如下:
命名:缓冲区序号[循环队列队首]发包序号

0[0](0)
1[0](-1)
2[0](-1)
3[0](-1)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](-1)
3[0](-1)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](-1)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](-1)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](4)
5[0](-1)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](4)
5[0](5)
6[0](-1)
7[0](-1)
*************************************
0[0](0)
1[0](1)
2[0](2)
3[0](3)
4[0](4)
5[0](5)
6[0](6)
7[0](-1)
*************************************
0[1](-1)
1[1](1)
2[1](2)
3[1](3)
4[1](4)
5[1](5)
6[1](6)
7[1](-1)
*************************************
0[2](-1)
1[2](-1)
2[2](2)
3[2](3)
4[2](4)
5[2](5)
6[2](6)
7[2](-1)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](-1)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
*************************************
0[3](8)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
*************************************
[color=red]0[3](8)
1[3](9)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
8[3](8)
9[3](9)
10[3](10)
11[3](-1)[/color]*************************************
0[3](-1)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
8[3](8)
9[3](9)
10[3](10)
11[3](11)
*************************************
0[3](12)
1[3](-1)
2[3](-1)
3[3](3)
4[3](4)
5[3](5)
6[3](6)
7[3](7)
8[3](8)
9[3](9)
10[3](10)
11[3](11)
*************************************
0[4](12)
1[4](-1)
2[4](-1)
3[4](-1)
4[4](4)
5[4](5)
6[4](6)
7[4](7)
8[4](8)
9[4](9)
10[4](10)
11[4](11)
*************************************
0[5](12)
1[5](-1)
2[5](-1)
3[5](-1)
4[5](-1)
5[5](5)
6[5](6)
7[5](7)
8[5](8)
9[5](9)
10[5](10)
11[5](11)
*************************************
0[6](12)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](12)
1[6](13)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](12)
1[6](13)
2[6](14)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
[color=darkred]0[6](12)
1[6](13)
2[6](14)
3[6](15)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](-1)[/color]*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](18)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](18)
1[6](19)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
[color=blue]0[6](18)
1[6](19)
2[6](20)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
18[6](18)
19[6](19)
20[6](20)
21[6](21)
22[6](-1)
23[6](-1)
24[6](-1)
25[6](-1)
26[6](-1)[/color]*************************************
0[6](-1)
1[6](-1)
2[6](-1)
3[6](-1)
4[6](-1)
5[6](-1)
6[6](6)
7[6](7)
8[6](8)
9[6](9)
10[6](10)
11[6](11)
12[6](12)
13[6](13)
14[6](14)
15[6](15)
16[6](16)
17[6](17)
18[6](18)
19[6](19)
20[6](20)
21[6](21)
22[6](22)
23[6](-1)
24[6](-1)
25[6](-1)
26[6](-1)
*************************************
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值