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 *********************************************************************/ #include "lrs.h" 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); lrs_send("socket0", "buf0", LrsLastArg); lrs_receive("socket0", "buf1", 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"); return 0; } vuser_end.c [cpp] view plaincopy #include "lrs.h" vuser_end() { lrs_cleanup(); return 0; } |
posted on 2013-12-10 10:53 順其自然EVO 閱讀(1179) 評論(0) 編輯 收藏 所屬分類: loadrunner