基於CS的客戶端壓力測試腳本編輯

上一篇 / 下一篇  2014-03-07 15:32:32 / 个人分类:LoadRunner

废话不多说,直接看代码:


1、了解客戶端和服務器端通訊的協議
  比如一下是某產品的登陸協議包:
typedef struct PK_LOGIN_SRC{
PK_HEADER pk_head;
char name[16];
char sig[32];
int ver;
unsigned char type;
unsigned char need_init;
char tm[9];
}PK_LOGIN_SRC;

2、组装协议包数据

PK_LOGIN_SRC *login;
//开辟内存
login=(PK_LOGIN_SRC *)malloc(sizeof(PK_LOGIN_SRC));
login->pk_head.cmd=htonl(CMD_LOGIN_SRC);
login->pk_head.size=htonl(sizeof(PK_LOGIN_SRC));
login->pk_head.seq=htonl(0);
memset(login->name,0,16);//网络字節,空字符串用0表示
memset(login->sig,0,32);
login->ver=0;
login->type=2,
login->need_init=0;
memset(login->tm,0,9);

3、建立Socket连接,发送数据包
//初始化设置加载dll和发送和结束等超时时间
lr_load_dll("getGETSPriceDLL.dll");
lr_load_dll("GET2.0.dll");
lrs_set_recv_timeout(5,0);
    lrs_set_recv_timeout2(5,0); 
    lrs_set_send_timeout(10,0);
lrs_set_connect_timeout(360,120);
//创建连接
   lrs_create_socket(socket_desc, "TCP", "LocalHost=0", "RemoteHost=127.0.0.1:6001",  LrsLastArg);
lrs_save_param_ex(socket_desc,"user",(char*)login,0,sizeof(PK_LOGIN_SRC),"ebcdic","param_l");
lrs_send(socket_desc, "buf0", LrsLastArg);


4、解析接受到的数据包,进行分析
//设置每次接收数据包的方式为:读取直到缓冲结束。
lrs_set_receive_option(EndMarker,EndMarker_None);
//不断的接受数据包进行解析判断
while(flag>0){
lrs_receive(socket_desc, "buf1", LrsLastArg);
lrs_get_last_received_buffer(socket_desc,&iBuff,&len);
DealBuff(iBuff,len);
//flag--;
}
//解析数据
void DealBuff(char *buff,int RecvLen){
   int buffLen = RecvLen;
int iProcLen = 0;
int headLen=sizeof(PK_HEADER);
//head=(PK_HEADER *)buff;
PK_TRADEDATA *tradedata;
//lr_message("@@@@@@@@@@@@@@@@@@@@@@@@");
   while(buffLen>headLen)
{
head=(GETS_PK_HEADER *)buff;
//lr_message("---------------------------");
switch(htonl(head->cmd)){
//如果是登录回包
case CMD_LOGIN_SRC_R:
lr_message("登錄成功");
break;
//如果是数据回包
case CMD_TRADE_DATA:
tradedata=(PK_TRADEDATA *)buff;
lr_message("%s,%s,%I64d,%f,%f",tradedata->no,htons(tradedata->price.price_feed),hton64i(tradedata->check_time),htonf(tradedata->price_buy),htonf(tradedata->price_sell));
break;
}
iProcLen = htonl(head->size);
buffLen = buffLen - iProcLen;
//指针往下移,继续解析后面的数据
buff += iProcLen;
}
}

5、常用的字节转化方法:
 
//C++里面整型64位
typedef struct __BIG_INT
{
unsigned long lowpart;
long highpart;
}BIG_INT;
typedef BIG_INT __int64

//长整型网络字节高地位转化
long htonl(long tmp)
{
WORD st[2],td;
*(int*)(st)=tmp;
td=st[1];
st[1]=st[0]<<8|st[0]>>8;
st[0]=td<<8|td>>8;
  return *(int*)st;
}
//字符网络字节转化
WORD htons(WORD tmp)
{
return tmp<<8|tmp>>8;
}
static char g_bNeedConvertByteOrder_hton = 0;
//浮点型网络字节转化
double htonf(double db)
{
  double dbRet;
      int * pSrc = (int*)&db;
int * pDes=(int*)&dbRet;
   if(!g_bNeedConvertByteOrder_hton)
{
if(htons(0x0102)==0x0102)
g_bNeedConvertByteOrder_hton = -1;
else g_bNeedConvertByteOrder_hton = 1;
}
if(g_bNeedConvertByteOrder_hton==-1)
return db;

pSrc = (int*)&db;
pDes=(int*)&dbRet;

pDes[0] = htonl(pSrc[1]);
pDes[1] = htonl(pSrc[0]);
return dbRet;
}
typedef unsigned int t_uint32;

//64位整型转化
__int64 hton64i(__int64 i)
{
   __int64 iRet;
   long * pSrc = (long*)&i;
   long * pDes=(long*)&iRet;
   if(!g_bNeedConvertByteOrder_hton)
{
if(htons(0x0102)==0x0102)
g_bNeedConvertByteOrder_hton = -1;
else g_bNeedConvertByteOrder_hton = 1;
}
if(g_bNeedConvertByteOrder_hton==-1)
return i;
   pDes[0] = htonl(pSrc[1]);
   pDes[1] = htonl(pSrc[0]);
   return iRet;
}


TAG: LR lr Lr socket Socket htonl htons htonf

 

评分:0

我来说两句

Open Toolbar