天天看點

LoadRunner—win/websockets通信中擷取資料

 過socket進行通信的分布式應用是比較常見的,包括winsocket和websocket,lr支援這兩個協定。

  在使用lr回放socket協定的腳本時,可能會經常需要擷取伺服器傳回的資料,語句格式如下:

lrs_create_socket("socket0", "tcp", "remotehost=1.2.3.4:12345",  lrslastarg);

lrs_send("socket0", "buf0", lrslastarg);

lrs_receive("socket0", "buf1", lrslastarg);

  很明顯,socket0是通信所用套接字,buf0是lr将要發送給伺服器的内容(來自使用者行為),buf1則接收伺服器傳回。

  我們經常需要通過提取buf1中的内容,并适當的加一些斷定語言,來判斷這個通信操作有沒有擷取期望的資料。經常使用函數lrs_get_last_received_buffer,如下:

  lrs_get_last_received_buffer("socket0", &actualbuffer, &numberofbytes);

  這樣就把lrs_receive接收到的資料儲存在了記憶體中(指針actualbuffer指向的一個有lr自動動态配置設定的記憶體塊),并傳回資料長度(儲存在numberofbytes中)。

  然後就可以像使用使用者自定義的數組一樣使用該緩沖區,如actualbuffer[0]。需要注意的是,使用完成後需要手動釋放actualbuffer指向的記憶體,通過調用lrs_free_buffer。

  下面是一個簡單示例,在處理伺服器傳回資料時,我們将其作為char數組處理,經過驗證這是沒問題的。

  完整代碼:

vuser_init.c

#include "lrs.h"

vuser_init()

{

lrs_startup(257);

return 0;

}

action.c

/*********************************************************************

* created by mercury interactive windows sockets recorder

*

* created on: tue nov 12 14:51:33

*********************************************************************/

action()

int numberofbytes=0;

char *actualbuffer;

unsigned char num1,num2,num3,num4;

unsigned int jifen =0;

int dj =0 ;

char * tmp;

int i=0;

lrs_create_socket("socket0", "tcp", "remotehost=10.15.107.12:12345",  lrslastarg);

/* get the last received buffer and its size. */

lrs_get_last_received_buffer("socket0", &actualbuffer, &numberofbytes);

//7b 9c 0b 00 00 0f 00 02 6c 00 00 00 08 00 90 5f 01 00 0d 00 00 00,從第偏移量17取數,直到14,作為積分;偏移量18為等級。

lr_output_message("the last buffer's size is:%d/n", numberofbytes);

num1 = actualbuffer[17];  //最高位

num2 = actualbuffer[16];

num3 = actualbuffer[15];

num4 = actualbuffer[14];  //最低位

lr_output_message("num1 = %d,num2 = %d,num3 = %d,num4 = %u\n",num1,num2,num3,num4);

jifen = (num1 / 16 ) * 268435456 + (num1 % 16)* 16777216 + (num2 / 16)* 1048576 +(num2 % 16) * 65536 +(num3 / 16) * 4096 +  (num3 % 16 ) * 256 +(num4 / 16)* 16 + (num4 % 16) * 1; //注意00 90 5f 01是16進制格式,其中01(num1)是最高位。

dj=(int)actualbuffer[18];

lrs_free_buffer(actualbuffer);

lr_output_message("jifen = %d\n",jifen );

lr_output_message("dj = %d\n",dj );

lrs_close_socket("socket0");

vuser_end.c

[cpp] view plaincopy

vuser_end()

lrs_cleanup();

最新内容請見作者的github頁:http://qaseven.github.io/