與socket通訊,有兩種方式,一種是建立長連接,建立后,不停的發送,接收。另外一種是建立短連接,建立連接,發送報文,接收響應,關閉連接。兩種方式server的開銷不同。Loadrunner可以把建立連接(關閉連接)是否放在VUSER_INIT(VUSER_END)中設置以上兩種通訊方式。
Step1:建立連接的代碼如下: int sc=0; sc = lrs_create_socket("socket1","TCP","RemoteHost=131.252.83.233:15017",LrsLastArg);
if (sc == 0)
lr_output_message("Socket was successfully created ");
else
lr_output_message("An error occurred while creating the socket, Error Code: %d", sc);
step2:建立連接成功后,就需要往socket上發送報文,發送報文的代碼如下:
lrs_send("socket1", "buf2", LrsLastArg);
Q1:那么有人會問這里的buf2是在哪里配置的?這個就需要我們打開腳本中的data.ws,這部分是放置是socket通訊發送和接收報文的。上面的發送報文的語句中buf2就需要在data.ws中配置。
配置例子如下:
send buf2 275 "/x30/x32/x37/x31”
這里我們分別解釋一下各字段的含義:
第一個符號“send“是代表buf2是發送報文。Data.ws中的報文有兩種,一種是發送buffer,一種是接收buffer,各自對應的符號標記為”send”和”recv”
第二個符號是buffer名稱,
第三個符號”275”是buffer長度,這里需要說明一下,send類型的buffer,loadrunner是根據下面配置的buffer內容來計算實際buffer長度的,因此對於send類型的buffer,這里的buffer長度只作為參考,實際上是無意義的。而recv類型的buffer,這里配置的buffer長度就必須特別注意了,loadrunner會根據配置的長度去接收socket上內容,loadrunner會嘗試去讀取一個符合配置長度的buffer內容。第二行是buffer內容,對於”recv”類型的buffer,loadrunner實際上是只是在log中會打印出expect receive buffer =你配置的buffer內容。
Q2:這里有人會再問,類似web(http)協議,發送的報文需要參數話,怎么做。Loadrunner里面操作也很簡單,選中需要參數話的報文內容-》右鍵――》參數化。后期的操作與web協議一樣。
Q3:這里有人會接着問,buffer里面配置的內容,以什么的編碼方式,能夠自行設定嗎?這里我們可以再看loadrunner的配置,recording options,這里有一項配置,translation table. LoadRunner編碼方式分為:ASCII碼、EBCDIC碼。如果選擇Translation Tables中“None”方式,就是ASCII編碼;其他都是選擇EBCDIC編碼方式,比如 00250352。其實Server是用0025方式編碼,Client是用0352方式。 LoadRunenr有自己的ebcdic字典,路徑是“/ebcdic”。 EBCDIC碼:8位編碼,可表示256個字符。EBCDIC是Extended Binary Coded Decimal Interchange Code之縮寫,成為擴展式2進制10進數交換碼或稱擴展式BCD碼。它是以左邊4個區域位元(Zone bit)及右邊4個數位位元合計8個位元組的資料碼,一共可組合2的8次方=256種組合方式。 Note that the following functions overwrite the same internal buffer (user buffer): o lrs_ascii_to_ebcdic o lrs_ebcdic_to_ascii o lrs_get_received_buffer o lrs_get_static_buffer o lrs_decimal_to_hex_string
Step3:發送成功后,需要接收報文,一般判斷測試是否通過是根據返回報文中的內容是否符合預期值來確認transaction是否通過。這里示例代碼如下:
lrs_receive("socket1", "buf3", LrsLastArg);
lrs_save_param_ex("socket1", "received", "buf3", 0, 90,"ebcdic", "Response1");
lr_output_message ("消費Response: %s", lr_eval_string(""));
position=(char*) strstr(lr_eval_string(""),
lr_eval_string("0170100400"));
if(position==NULL)
lr_end_transaction("消費", LR_FAIL);
else
lr_end_transaction("消費", LR_PASS);
Q4:這里有人會問,為什么我的代碼執行到lrs_receive的時候,log里面打印Waiting for writable socket 10 secs, 0 usecs,都需要等待10秒鍾。是這樣的,因為你在data.ws中定義了recv buffer的長度,例如你定義為100,但是socket上的返回buffer長度不是100,這時候,loadrunner會嘗試再次去讀取,直到讀到長度為100的buffer才算成功。嘗試多次,超時時間為多少?loadrunner默認為10s,所以你這里才會有等待10s的情況出現。我們可以指定超時時間:lrs_set_recv_timeout(1,10); 第一個參數是s,第二個參數是ms
當然實際情況,多數socket返回的響應buffer是變長的,這種情況下我們可以采取如下措施:
1.如果知道變長的recv buffer以什么結尾的話,可以設定loadrunner讀取的時候,讀到什么內容的時候停止讀取。 lrs_set_receive_option(EndMarker, BinaryStringTerminator, "//x00//x07Mercury"); 具體lrs_set_receive_option還有多種用法,請參加幫助文檔 2.或者我們手工指定loadrunner腳本,捕獲多長的buffer。就需要使用如下代碼來代替lrs_receive: lrs_receive_ex("socket1", "buf3", "NumberOfBytesToRecv=150", LrsLastArg);