過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/