通过FTP服务的winsockes录制脚本

发表于:2007-12-07 16:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:阳光    来源:51Testing投稿

脚本分析
1) 在上述脚本中建立了三个Socket,分别是Socket0;socket1和socket2,其中Socket0负责FTP命名链的交互,Socket1和Socket2完成了两次数据链的交互;
2) Buf0到Buf7完成了FTP用户的登录过程;Buf8-Buf18完成了FTP的一些命令:PWD、PEAT等命令;
3) 然后创建Socket1,完成数据的下载;
4) 数据下载完成后Socket1关闭:
   lrs_disable_socket("socket1", DISABLE_SEND);
    lrs_close_socket("socket1");
5) 下面有重新建立了一个Socket2下载另外的数据完成后关闭
lrs_disable_socket("socket2", DISABLE_SEND);
lrs_close_socket("socket2");
6) 看到脚本的尾部,没有发现Socket0的关闭语句,这种情况在VUG中调试脚本的时候是没有问题的,但是,如果都用户并发运行就会出现Socket冲突的问题,所以我们首先加上Socket0关闭的语句;参考Socket1的关闭语句就可以:
lrs_disable_socket("socket0", DISABLE_SEND);
lrs_close_socket("socket0");
7) 回放一下脚本,发现出错了,不要着急,中心按照录制脚本的步骤,录制一个相同操作的脚本;
8) 比较原来的脚本和新录制的脚本,看看有什么不同,哈哈发现了几处不同,但是很多都是Rec的,这个应该不是关键的地方,因为收到的信息一般影响不是很大,所以继续寻找,被我找到了吧,在看看下面的比较结果:
      

1

从上图中我看到Send Buf21 的值不同,并且好像是有一位不同,但是我还是茫然,为什么会不同呢,这个值又是从什么地方来的内,在看看上边那个Recv Buf 17 ,小样原来问题在这里,这个BUF 21中的这个"\x05\xbb\x0e\xd7"串,是由Buf17中的数据变化而来的,Buf17 "227 Entering Passive Mode (192,168,5,187,14,215)\r\n"看看215的16进制是不是d7,14的16进制是不是0e,终于被我找到了,那就把它动态的替换了吧(学名关联);
9) 关联
int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);
这个函数的意思是,在Buf中查找一个字符串,然后保存到一个LR变量中;
有了他我们就好办了,看看下面的语句:
lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);
lrs_save_param("socket0", NULL, "param2", 41, 3);
lrs_save_param("socket0",NULL, "param1", 44, 3);
10) 变量变换
但是又遇到一个问题,通过这两个函数取出来的值是两个10进制的数,比如上面的例子取出来的值,param2=14,param1=215;但是我们需要的值是16进制的,所以还需要变化一下,看下面的函数;
n=atoi(lr_eval_string("<param1>"));//将LR变量变化为整型付给C语言变量n;
m=atoi(lr_eval_string("<param2>"));//将LR变量变化为整型付给C语言变量m;
sprintf(pam,"\\x05\\xbb\\x0%x\\x%x",m,n);//将得到的字符串保存到字符串变量pam中;
lr_save_string (pam,"param");//将字符串C语言变量转换为LR变量Param
11) 增加一个标志
经过上面的操作这个脚本可以成功回放了,但是还是会出现一些recv Buf时等待的问题,这是因为每次返回的值的字节数肯能不同;怎么解决这个问题呢,查找帮助后,需要在函数中增加一个标志:"Flags= MSG_PEEK";这个标志表示不对Buf大小进行检查,如下所示:
lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);
最终脚本
Action()
{
 /*通过Sockes代理运行Ftp协议
 作者:质量检测部 李刚*/
 int n,m;
 char pam[20];
    lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.2.195:1080",  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);
    lrs_send("socket0", "buf10", LrsLastArg);
    lrs_receive("socket0", "buf11", LrsLastArg);
    lrs_send("socket0", "buf12", LrsLastArg);
    lrs_receive("socket0", "buf13", LrsLastArg);
    lrs_send("socket0", "buf14", LrsLastArg);
    lrs_receive("socket0", "buf15", LrsLastArg);
    lrs_send("socket0", "buf16", LrsLastArg);
  lrs_receive("socket0", "buf17","Flags= MSG_PEEK",LrsLastArg);
 lrs_save_param("socket0", NULL, "param2", 41, 3);
 lrs_save_param("socket0",NULL, "param1", 44, 3);
    n=atoi(lr_eval_string("<param1>"));
 m=atoi(lr_eval_string("<param2>"));
    sprintf(pam,"\\x05\\xbb\\x0%x\\x%x",m,n);
 lr_save_string (pam,"param");
    lrs_send("socket0", "buf18", LrsLastArg);
    lrs_create_socket("socket1","TCP","RemoteHost=192.168.2.195:1080",  rsLastArg);
    lrs_send("socket1", "buf19", LrsLastArg);
    lrs_receive("socket1", "buf20", LrsLastArg);
    lrs_send("socket1", "buf21", LrsLastArg);
    lrs_receive("socket1", "buf22","Flags= MSG_PEEK", LrsLastArg);
    lrs_receive("socket0", "buf23","Flags= MSG_PEEK", LrsLastArg);
    lrs_receive("socket1", "buf24", LrsLastArg);
    lrs_disable_socket("socket1", DISABLE_SEND);
    lrs_close_socket("socket1");
    lrs_receive("socket0", "buf25","Flags= MSG_PEEK", LrsLastArg);
    lrs_send("socket0", "buf26", LrsLastArg);
    lrs_receive("socket0", "buf27","Flags= MSG_PEEK", LrsLastArg);
 lrs_save_param("socket0", NULL, "param2", 41, 3);
 lrs_save_param("socket0",NULL, "param1", 44, 3);
    n=atoi(lr_eval_string("<param1>"));
 m=atoi(lr_eval_string("<param2>"));
    sprintf(pam,"\\x05\\xbb\\x0%x\\x%x",m,n);
    lr_save_string (pam,"param");
    lrs_send("socket0", "buf28", LrsLastArg);
    lrs_create_socket("socket2","TCP","RemoteHost=192.168.2.195:1080", LrsLastArg);
    lrs_send("socket2", "buf29", LrsLastArg);
    lrs_receive("socket2", "buf30", LrsLastArg);
    lrs_send("socket2", "buf31", LrsLastArg);
    lrs_receive("socket2", "buf32", LrsLastArg);
    lrs_receive("socket0", "buf33", "Flags= MSG_PEEK",LrsLastArg);
    lrs_receive("socket2", "buf34", LrsLastArg);
    lrs_disable_socket("socket2", DISABLE_SEND);
    lrs_close_socket("socket2");
    lrs_receive("socket0", "buf35","Flags= MSG_PEEK", LrsLastArg);
 lrs_disable_socket("socket0", DISABLE_SEND);
    lrs_close_socket("socket0");
    return 0;
}
总结
1) 录制脚本前对脚本进行一些分析;
2) 脚本录制完成后,需要调试;
3) 如果不能运行,查看调试信息,比对不同的脚本;
4) 了解服务本身的情况,比如FTP协议,winsocket协议等;
5) 分析的过程中需要认真;
6) 多看LR的帮助。

 

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号