|
我使用的是LR8.1
我翻查网上很多资料,大多数资料表明LR的Socket通信是同步的(即阻塞通信),换句话说就是假设没有收到上一条请求的响应信息的话就会一直等到超时。
但是我却遇到了以下问题,
代码片断:
1 lrs_send("socket1", "buf27", LrsLastArg);//发送20M数据包
2 lrs_receive("socket1", "buf28", LrsLastArg);//接收"150"响应
3 lrs_send("socket1", "buf29", LrsLastArg);//继续代码
4 lrs_receive("socket1", "buf30", LrsLastArg);
正常流程应该是这样的:
1、发送一个非常大的数据包(20MB)
2、发送完成后服务器返回一个"150"给我
3、我继续执行下一句语句
但是实际上却是这样的:
1、发送一个非常大的数据包(20MB),服务器限制了500k/s的速度(约40秒才会发送完成)
2、但约10秒后跳过了第1句lrs_send代码,执行第2句lrs_receive代码时 服务器返回了一个""给我(0长度的字符),但这个时候通过网络监测工具看到数据仍在传输
3、下面的语句执行失败
如果是这样的话,从现象来看Socket通信明显是异步的(非阻塞的),因为它没等数据传输完成就执行下一句了。如果是这样的话不断循环就会乱套了
后来我在lrs_send("socket1", "buf27", LrsLastArg)句后面加上了一句lr_think_time(40)可以解决这个问题,但另一个问题来了,就是如果我虚拟用户增加了以后每个用户的传输速度就会降下来,也就是说实际上可能需要更长的时间,那最后还是回导致数据乱套的问题
我想请教以下问题:
1、若LR的Socket通信是异步的,那是否可以设置成同步传输,即阻塞模式
2、若LR的Socket通信是同步的,那为什么数据没有传输完成的情况下LR就执行下一步操作?
3、是否LR只是把(20M)数据包发送到Scoket缓冲里就当是完成了?(因为我们一般不会Sand很大的数据包,所以并没有感觉到这个问题的存在)
4、是否有办法确实的等到了(20M)数据包发送完成后才继续执行以下语句?具体需要怎样做?
另外问一个相关的问题
我测试的结论是LR的速度模拟设置只能限制下载的速度,不能限制上传的速度,不知道各位是否有遇到这样的问题?
[ 本帖最后由 chooffy104 于 2009-4-14 19:01 编辑 ] |
|