winsocket协议回放mismatch问题
录制c/s软件,使用winsocket协议,回放的时候出现mismatch的错误,录制的时候是buf221接收到68078byte,回放的时候是0byte,如果在send和receive之间加入一段时间的thinktime的时候,就可以完全接收到68078byte的内容。但是要测试响应时间的话不能加入thinktime,所以用了下面的方法,加入了while循环,次运行的时候发现有的时候能通过,有的时候会一直循环半个小时,不知道是什么原因,哪位高手能够帮我解决一下这个问题,如何能测试出这段脚本的响应时间。int i=0;
lrs_send("socket1", "buf220", LrsLastArg);
while( i!=68087)
{
lrs_receive("socket1", "buf221", LrsLastArg);
i=lrs_get_last_received_buffer_size ("socket1");
} 返回的数据是动态的,出现MISMATCH不奇怪,设置一下匹配时间的最大值就可以了!lrs_set_recv_timeout2().
另外你这个代码有时通过是因为你接收的包大小刚好跟录制时的一样,即是68087,如果第一次接收的不是68087的话基本上死循环了,因为lrs_receive函数是读缓冲的,读过的缓冲会清掉,就是说第一次读的缓冲其实已经读了,不过大小不一致而已,那么你继续循环读的话根本不可能再读到那个完整的包了(被第一次读时清掉了),于是一直在等.你可以尝试用下面的函数:
lrs_set_receive_option(EndMarker, EndMarker_None ) // 读取直到缓冲结束.
lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //读取直到"\r\n"符号出现 . 你可以根据自己的接收数据的结束符修改
lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00") 读取直到二进制符号"\\X00"出现
mythxhg 谢谢
解释得很清楚:)真实费心了 mythxhg,非常感谢,解释的很清楚,我设置了lrs_set_recv_timeout2()之后,不再出现mismatch的情况了,分析了一下,是因为lrs_send("socket1", "buf220", LrsLastArg)语句执行之后,服务器开始一段长时间的处理,要等待服务器处理完之后才可以收到68078byte的内容。 lrs_set_receive_option(EndMarker, EndMarker_None ) // 读取直到缓冲结束.
我也尝试过这个函数,读取到的是0字节,可能是因为当时服务器没有处理完,所以缓存中确实是0字节
lrs_set_receive_option(EndMarker, RecordingSize) // 读取录制时缓存同样大小的数据
我觉得这个函数应该可以,不知道为什么还是接收到0字节 原帖由 xingmemory 于 2007-11-19 18:31 发表 http://bbs.51testing.com/images/common/back.gif
mythxhg,非常感谢,解释的很清楚,我设置了lrs_set_recv_timeout2()之后,不再出现mismatch的情况了,分析了一下,是因为lrs_send("socket1", "buf220", LrsLastArg)语句执行之后,服务器开始一段长时间的处理,要 ...
我也想请教一下,请问LZ你把lrs_set_recv_timeout2设置成多大了?我记得这个参数如果不设置的话,默认是10秒的,我测试的时候如果没收到数据的话,好像脚本会一直在那等待直到收到数据或者超时的阿,但你怎么会收到0 byte呢?能不能请 mythxhg 帮忙解释一下呢,谢谢了。 接收超时和匹配超时这2个函数是不同的哦,
0 byte这个现象有很多可能性,比较常见的就是因为服务器没返回,为什么没返回?那就要调试了,信不过LR的话就用个网络助手发你那个包过去看看有没返回.
另外你用那个函数的时候要注意用法,
lrs_set_receive_option(EndMarker, RecordingSize);
lrs_receive("socket1", "buf2", LrsLastArg);
一起用是先将接收的方式设置为根据录制时的长度接收,所以在下面一句的时候就会根据实际录制到的长度接收,
读取的话我觉得你试试这2个比较好
lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //读取直到"\r\n"符号出现 .
lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00") 读取直到二进制符号"\\X00"出现
因为LR的RECV跟写程序里的RECV是不大同的,程序里RECV2次的话很可能LR录制的时候只RECV一次,LR是根据你设置的接收方式来读取,而程序是根据代码则是按照自己代码设置的方式读取,例如LR设置是根据录制大小1000来接收,而程序的代码里是每次读取缓存500BYTE内容. LR有时会出现2个相邻的SEND所RECV的内容混在一起,这种情况就是第一个SEND所RECV的还没接完就SEND了第二个包,所以最好就用
lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //读取直到"\r\n"符号出现 .
lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00") 读取直到二进制符号"\\X00"出现
,这2个函数可以让你第一个SEND的RECV要接完之后才开始SEND第二个包.避免他们混到一起.
回复 8# 的帖子
8# 大 中 小 发表于 2007-11-21 12:25只看该作者LR有时会出现2个相邻的SEND所RECV的内容混在一起,这种情况就是第一个SEND所RECV的还没接完就SEND了第二个包,所以最好就用
lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //读取直到"\r\n"符号出现 .
lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00") 读取直到二进制符号"\\X00"出现
,这2个函数可以让你第一个SEND的RECV要接完之后才开始SEND第二个包.避免他们混到一起.
------------------------------------------------------------------------------------------------------------------------------------------]
你这怎么可以呢,要是我的接收的内容如下:"0x88bb88bb0x003E",那这个3E不就是被丢掉了,后面还怎么搞!而且如果是UDP的话,上面的这两种参数根本不支持。
还是用lrs_set_receive_option(EndMarker, EndMarker_None ) // 读取直到缓冲结束.
是比较合理的。
[ 本帖最后由 zengyixun 于 2008-11-27 11:09 编辑 ]
回复 9# 的帖子
您上面说的那几个函数怎么用呀!lrs_create_socket("socket0", "TCP", "RemoteHost=BONSON-UXG8YPMV:1433",LrsLastArg);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);
lrs_send("socket0", "buf2", LrsLastArg);
lrs_receive("socket0", "buf3", LrsLastArg);
lrs_send("socket0", "buf4", LrsLastArg);
//lrs_set_receive_option(EndMarker, StringTerminator , "\r\n"); //读取直到"\r\n"符号出现 .
// lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00"); //读取直到二进制符号"\\X00"出现
lrs_set_receive_option(EndMarker, EndMarker_None );
lrs_receive("socket0", "buf5", LrsLastArg);
我是这么用的,不知道行不行。回放日志:Action.c(28): Mismatch (expected 59 bytes, 0 bytes actually received)
Action.c(31): lrs_send(socket0, buf6)
Action.c(33): lrs_receive(socket0, buf7)
Action.c(33): 错误: socket0 - 软件造成连接终止。错误代码: 10053 我也碰到了相同的问题,在action中使用了 lrs_set_receive_option
static int count=0;
if(count==0)
{
lrs_create_socket("socket1", "TCP", "RemoteHost=192.168.1.55:10001",LrsLastArg);
lrs_send("socket1","buf4", LrsLastArg);
lrs_receive("socket1","buf5", LrsLastArg);
count++;
}
lrs_send("socket1","buf6", LrsLastArg);
lrs_set_receive_option(EndMarker,RecordingSize);
lrs_receive("socket1","buf7", LrsLastArg);
直接运行多次是不会有问题的,但是,当有并发的时候,只有一个用户运行正常,其他用户运行几次iteration后出现Mismatch信息
Starting iteration 7.
Starting action Action.
Action.c(28): lrs_set_receive_option
Action.c(30): lrs_send(socket1, buf6)
Action.c(32): lrs_receive(socket1, buf7)
Ending action Action.
Ending iteration 7.
Starting iteration 8.
Starting action Action.
Action.c(28): lrs_set_receive_option
Action.c(30): lrs_send(socket1, buf6)
Action.c(32): lrs_receive(socket1, buf7)
Action.c(32): Mismatch (expected 24 bytes, 0 bytes actually received)
不知道这个是什么原因造成的?等高手帮忙,谢谢 windows socket协议
Action()
{
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=ATENA-SOFTDEV:1433", LrsLastArg);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);
lrs_send("socket0", "buf2", LrsLastArg);
lrs_receive("socket0", "buf3", LrsLastArg);
lrs_send("socket0", "buf4", LrsLastArg);
lrs_receive("socket0", "buf5", LrsLastArg);
lrs_send("socket0", "buf6", LrsLastArg);
lrs_receive("socket0", "buf7", LrsLastArg);
lrs_send("socket0", "buf8", LrsLastArg);
lrs_receive("socket0", "buf9", LrsLastArg);
return 0;
}
当执行到buf7的时候会出现一个错误Software caused connection abort. Error code : 10053求教大家。急啊! 我也遇到相同的问题,请问各位有解决方案没啊,有的话贴出来呗,感激不尽啊~~ 楼上问题 解决了吗 ?我也碰到同样地问题 同求解决方案。。。 关注中。。
页:
[1]