Linux下Loadrunner建立socket连接方法
转子:
http://blogs.360.cn/360qtest/2014/06/12/linux下loadrunner建立socket连接方法/
Loadrunner已经成为广泛使用的性能测试工具,而多数人都是在windows环境下进行压力测试,这就会有很多的局限性。
比如想使用Loadrunner对HandlerSocket做一次性能测试,这种需要建立Socket连接的大多测试人员很快会想起使用LR支持的WinSocket协议,里面内置了很多socket操作函数,很方便。但是WinSocket协议只能在windows环境下运行,首先需要对测试环境的tcp/ip连接数情况进行测试,确保你的测试机、被测试机上不存在TCP/IP连接数限制,或者其他问题等等,Windows xp、Windows server 2003的最大TCP/IP连接数都有限制,如果更改还要去修改注册表等。
#include “lrs.h”
vuser_init()
{
lrs_startup(257);
lrs_create_socket (“socket1″,”TCP”,”RemoteHost=10.131.100.21 :9994″,LrsLastArg);
return 0;
}
#include “lrs.h”
Action()
{
lr_start_transaction(“HandlerSocket”);
lrs_set_receive_option (EndMarker,StringTerminator,”\n” );
lrs_send (“socket1″,”buf1″,LrsLastArg);
lrs_receive (“socket1″,”buf2″,LrsLastArg);
if(memcmp(lrs_get_received_buffer (“socket1″,0,4,NULL),”0\t1\n”,4)==0)
{
lrs_send (“socket1″,”buf3″,LrsLastArg);
lrs_receive (“socket1″,”buf4″,LrsLastArg);
if(memcmp(lrs_get_received_buffer (“socket1″,0,4,NULL),”0\t4\t”,4)==0){
lr_end_transaction(“HandlerSocket”, LR_PASS);
}else{
lr_end_transaction(“HandlerSocket”, LR_FAIL);
}
}else{
lr_end_transaction(“HandlerSocket”, LR_FAIL);
}
return 0;
}
#include “lrs.h”
vuser_end()
{
lrs_close_socket (“socket1″);
lrs_cleanup();
return 0;
}
;WSRData 2 1
send buf1 100
“P 1 mem_test sbtest PRIMARY id,k,c,pad\n”
recv buf2 4
“0\t1\n”
send buf3 100
“1 = 1 <id> 1 0\n”
recv buf4 4
“0\t4\t”
测试过程中我们发现被测试服务器根本压不上去,资源很空闲,原因就是建立的socket连接很有限。这时我们会想到强大的Linux系统,它允许建立的TCP/IP连接数很大,而且修改很方便。但是Loadrunner在linux下又不支持WinSocket协议,那我就为LR编译一个Linux下的扩展好了,大家都知道Windows下的dll动态连接库可以用lr_load_dll()函数加载,那linux下的.so文件一定可以用这个函数来加载,这样就和windows下的用法一样了,问题就解决了,首先用C写好linux sokcet建立连接、发送请求、接收返回、关闭连接的方法,然后编译成.so文件。
handlersocket.c文件代码:
#include <unistd.h> #include <sys/types.h> /* basic system data types */ #include <sys/socket.h> /* basic socket definitions */ #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */ #include <arpa/inet.h> /* inet(3) functions */ #include <netdb.h> /*gethostbyname function */ #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <string.h> #define MAXLINE 1024 int opensocket(char *ip,int port) { int connfd; char * servInetAddr = ip; int servPort = port; // char dataBuffer[MAXLINE]; struct sockaddr_in servaddr; connfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(servPort); inet_pton(AF_INET, servInetAddr, &servaddr.sin_addr); if (connect(connfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { perror(“connect error”); return -1; }else{ //return 1; return connfd; } } void closesocket(int connfd){ close(connfd); } int msgsend(int connfd,char *msg){ char dataBuffer[MAXLINE]; bzero(dataBuffer,MAXLINE+1); strncpy(dataBuffer,msg,strlen(msg)); int errSend = send(connfd,dataBuffer,strlen(dataBuffer),0); if(-1 == errSend) { return -1; }else{ return 1; } } int cmprecvmsg(int connfd,char *msg,int len){ char dataBuffer[MAXLINE]; bzero(dataBuffer,MAXLINE+1); int recv_bytes = recv(connfd,dataBuffer,MAXLINE,0); //return dataBuffer; if(recv_bytes < 0) { return -2; } if(memcmp(dataBuffer,msg,len)==0){ return 1; }else{ return -1; } }
编译方法:
Action()
{
int a,b,i;
int connfd;
char *msg;
char msg1[1024];
char *ip= “10.131.100.21”;
int port = 9994;
lr_load_dll (“/home/fuhaitao/libhandlersocket.so”);
connfd=opensocket(ip,port);
msg=”P 1 mem_test sbtest PRIMARY id,k,c,pad\n”;
msgsend(connfd,msg);
a = cmprecvmsg(connfd,”0\t1\t”,3);
for(i=1;i<=10000;i++){
lr_start_transaction(“handlersocket”);
// msg=”P 1 mem_test sbtest PRIMARY id,k,c,pad\n”;
// connfd=opensocket(ip,port);
// msgsend(connfd,msg);
// a = cmprecvmsg(connfd,”0\t1\t”,3);
sprintf(msg1,”1 = 1 %s 1 0\n”,lr_eval_string (“{id}”));
msgsend(connfd,msg1);
b=cmprecvmsg(connfd,”0\t4\t”,3);
if(b!=1 || a!=1){
lr_end_transaction(“handlersocket”, LR_FAIL);
}else{
lr_end_transaction(“handlersocket”, LR_PASS);
}
}
closesocket(connfd);
return 0;
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。