Error code 10053,Software caused connection abort.總結
C/S結構程式,請求響應採用非同步機制。即客戶端傳送一個請求後不是一直等待這個結果,客戶端將請求存放在請求佇列並獲得一個JOBID,伺服器執行後將執行結果存放在響應佇列,客戶端定時檢視響應佇列,根據JOBID定時從響應佇列中獲取結果。因此帶來的測試問題是受伺服器狀態影響,客戶端獲取結果的次數不固定。
測試指令碼示例
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=localhost:8080", LrsLastArg);
lrs_send("socket0", "buf56", LrsLastArg);
lrs_receive("socket0", "buf57", LrsLastArg);
GetJobID();
do{
lr_think_time(0.3);
lrs_send("socket0", "buf58", LrsLastArg);
lrs_receive("socket0", "buf59", LrsLastArg);
}while(!CheckStatus());
其中buf56、57是傳送請求,buf58、59是迴圈去獲取結果並檢查返回的標誌位,若仍沒有結果返回則在一定時間後迴圈獲取結果,因此請求數不固定。
LR提示socket異常
當我用lrs_create_socket建立連線之後,當這個socket連線的請求次數達到100次後,這個連線就不可用了,必須close後再重新create。LoadRunner提示錯誤:Error : socket0 - Software caused connection abort. Error code : 10053.
問題驗證
一開始認為是LoadRunner對Socket的支援問題,因為同樣的測試方式在Rational Robot中可以通過。於是做了最簡單的一個試驗:
1、用socket方式錄製訪問某個網頁並儲存(如baidu、或tomcat的預設頁面)
2、新增迴圈方式去訪問
結果證明在socket請求次數達到100後即無法再次訪問了(少數次數可以達到一百零幾)。
指令碼如下:
#include "lrs.h"
int i;
Action()
{
lr_think_time(1);
lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=appsvr01:8080", LrsLastArg);
i=1;
do{
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);
lr_output_message("-------------lrs request times: %d ", i);
i++;
lrs_send("socket0", "buf2", LrsLastArg);
lrs_receive("socket0", "buf3", LrsLastArg);
lr_output_message("-------------lrs request times: %d ", i);
i++;
lrs_send("socket0", "buf4", LrsLastArg);
lrs_receive("socket0", "buf5", LrsLastArg);
lr_output_message("-------------lrs request times: %d ", i);
i++;
lrs_send("socket0", "buf6", LrsLastArg);
lrs_receive("socket0", "buf7", LrsLastArg);
lr_output_message("-------------lrs request times: %d ", i);
i++;
}while(i<200);
return 0;
}
LoadRunner VUGen日誌如下:
...
lrs_send(socket0, buf2)
Action.c(21): lrs_receive(socket0, buf3)
Action.c(22): -------------lrs request times: 98
Action.c(24): lrs_send(socket0, buf4)
Action.c(25): lrs_receive(socket0, buf5)
Action.c(26): -------------lrs request times: 99
Action.c(28): lrs_send(socket0, buf6)
Action.c(29): lrs_receive(socket0, buf7)
Action.c(29): Mismatch (expected 1249 bytes, 1268 bytes actually received)
Action.c(30): -------------lrs request times: 100
Action.c(16): lrs_send(socket0, buf0)
Action.c(17): lrs_receive(socket0, buf1)
Action.c(17): Error : socket0 - Software caused connection abort. Error code : 10053.
Abort was called from an action.
Ending Vuser...
Starting action vuser_end.
vuser_end.c(12): lrs_cleanup()
Ending action vuser_end.
新的發現
在發現以上問題後百思不得其解之後即和一些測試朋友進行討論交流,但同樣沒有什麼頭緒。在一次交流中意外發現朋友的測試指令碼中連線的是80埠,於是推斷他是用IIS作為測試伺服器,突然意識到這是否和應用伺服器也有關,立即採用IIS作為伺服器進行測試,居然測試通過了,並沒有出現Socket連線問題!隨後用Weblogic進行測試也同樣通過!
初步結論
由以上的各種驗證方法發現問題並非單獨由LoadRunner引起的,而是和測試的應用伺服器也有很大關係。僅當用LoadRunner測試Jboss、Tomcat伺服器時才會出現這種問題,而對IIS、Weblogic等問題並不存在。但另有一個奇怪的問題是採用Rational Robot用同樣的測試方法,所有的伺服器型別都沒有問題!
繼續探索
後來進一步研究為何同樣的採用tomcat伺服器,在請求上有什麼不同差異導致了兩種測試工具決然不同的測試結果。但通過Charles工具只是發現了一些請求上的細微差異,並不會造成此問題的發生。於是此疑案懸而未決,希望有志之士加入一起研究,共同探索其中奧祕!