先是一个dll,我的做法是简单的实现了下radius协议的组包,然后去A了ZwelL的UDP发包代码,通过UDP封包发给服务器,直接读取返回值中的RADIUS协议第一个字节就知道结果了。详见附件。
主要的一个比较郁闷的问题在于radius协议的Authenticator字段,协议规定,每个包的这个字段必须不同,否则视为重复发送的封包直接XX掉。在C里面实现的时候用了rand函数,设置seed为time(),因为time的精确度为1s,导致并发的时候出现部分重复的Authenticator封包发送,这样在loadrunner上测试就表现为fail事务的失败率7%左右,后面使用_ftime来获取比较精确的时间作为种子(一种说法是可能不是十分精确,不过我的要求仅仅是连续的时候尽量是不同的,就符合了)再次测试。这次好点,50U下跑了8个小时,失败率大概在0.5%左右,可以接受。
还有个很奇怪的事情,
int i=0;
i = i + 2;
//printf("i:%d\n",i);
if(type==0x02)
{
pwdencode(pass, value,auth,secret);
for(i=2;j<16;j++,i++){
typeString[i] = pass[j];
}
}
在里面的循环的时候不加i=2的赋值,编译成EXE后执行正常,for循环以i=2开始,编译成dll的时候则for循环中i=0开始,极度无语。
Loadrunner部分如下:
在vuser_init中载入编写的dll
#include "lrs.h"
vuser_init()
{
lrs_startup(257);
lr_load_dll("RadiusClient.dll");
return 0;
}
然后action中则执行dll中导出的验证函数:
#include "lrs.h"
Action()
{
int result=0;
lr_start_transaction("RSA");
result = sendRadiusAuthorize( lr_eval_string("<user>") , "1111", "suddy", "10.0.250.81", "10.0.250.199");
lr_message("测试的结果为%d",result);
if(result==2){
lr_end_transaction("RSA", LR_PASS);
}else {
lr_error_message("错误ID:%d",result);
lr_end_transaction("RSA", LR_FAIL);
}
return 0;
}
其中<user>为参数化用户名
然后直接让loadrunner去 run就可以了。从结果来看还是很强悍的,YY结论是这台测试机器1分钟可以验证4W8的用户。恐怖。折去使用动态口令时的算法消耗,估计也可以是2W5左右,强哪。
先唠叨这些,附件是dll的code,记录下,以备后查。
10.09ps : 测试web login中 必须ignore thinktime 并且 关闭 simulated browser
否则结果有较大的偏差。
