loadrunner socket 测试

来源:互联网 发布:苹果经常无法加入网络 编辑:程序博客网 时间:2024/05/25 21:34
ACITON:

#include "lrs.h"


//定义全局变量:retmsg返回的报文,接收报文长度

char g_retmsg[4048];
int  g_retlen=0;

//报文头的长度:使用的8583的报文,12个字节的报文头部信息,最后的4个字节的字符表示后续报文的长度
int  g_headlen=12;
//报文长度的偏移量,和表示长度的字节数
int  g_offset=8;
int  g_msglen=4;





Action()
{

    char sResponse[3];//8583的返回码
    int  iRes_off=g_headlen+2;//8385 39域所在偏移量

    int iRet=-1;//自定义接收报文函数返回值
    


    //清空接收报文的BUFF  全局变量
    memset(g_retmsg,0x00,sizeof(g_retmsg));
   memset(sResponse,0x00,sizeof(sResponse));


    lr_start_transaction("HF_QUERY");//定义交易名称
    lrs_set_recv_timeout(30,0);//建立连接前的超时时间
    lrs_set_recv_timeout2(60,0);//接收超时时间


    //创建SOCKET 通讯连接
    lrs_create_socket("socket0", "TCP", "RemoteHost=127.0.0.1:60000",LrsLastArg);
    //发送报文
    lrs_send("socket0", "buf0", LrsLastArg);

    iRet=custom_lrs_receive("socket0", "buf1", LrsLastArg);

    if(iRet!=0)
    {
        lr_message("交易失败,接收报文失败!");
        lrs_close_socket("socket0");
        lr_end_transaction("HF_QUERY", LR_FAIL);
    }
    else
    {
        lr_message("接收报文成功!");
        
    }

    memcpy(sResponse,g_retmsg+iRes_off,2);

    lr_output_message("------sResponse = [%s]-------",sResponse);

    if(memcmp(sResponse,"00",2)==0)//交易成功
    {
        lrs_close_socket("socket0");
        lr_end_transaction("HF_QUERY", LR_PASS);
    }
    else{

         lrs_close_socket("socket0");
         lr_message("交易失败返回码失败");
         lr_end_transaction("HF_QUERY", LR_FAIL);

    }




    return 0;
}







//自定义通讯函数,用于接收8583的不定长的报文格式
//接收到的包文件放入到 全局变量 g_retmsg,和g_retlen中
//参数说明 :sock_desc (socket句柄) ,buf_desc (data中的接收buf名称) ,dummy 这个参数没有什么用

int custom_lrs_receive(char *sock_desc, char *buf_desc,void *dummy)
{

    int rc;
    int buf_len = g_headlen;//报文头的长度
    char szBytesLength[30];


    char *buf = NULL, *pszError, *pszLastChar;

    char sMsgLen[20];

    memset(sMsgLen,0x00,sizeof(sMsgLen));
    memset(szBytesLength,0x00,sizeof(szBytesLength));

    //首先接收报文头的长度:g_headlen=12
    //rc = lrs_receive_ex(sock_desc, buf_desc, "NumberOfBytesToRecv=12", LrsLastArg);


    lr_output_message("----------- RECICVER start -----------");
    sprintf(szBytesLength,"NumberOfBytesToRecv=%d",g_headlen);
    rc = lrs_receive_ex(sock_desc, buf_desc,szBytesLength,LrsLastArg);


    if (rc!= 0)     //正常情况下函数返回为0,非0表示函数有错误
    {
        lr_error_message("ERROR: 接收报文头错误   Error_code= %d", rc);
        return -1;

    }


    //判断前6个字节是否接受成功
    lrs_get_last_received_buffer(sock_desc, &buf, &buf_len);

    if (buf == NULL || buf_len != g_headlen)
    {
        lr_error_message("ERROR:接收报文头错误,长度不符,或者buff未接收  BUFF=[%s]", buf_desc);
        return -1;
    }

    //复制报文头到全局BUFF中

    memcpy(g_retmsg,buf,g_headlen);
    memcpy(sMsgLen,buf+g_offset,g_msglen);

    
    memset(szBytesLength,0x00,sizeof(szBytesLength));
    sprintf (szBytesLength, "NumberOfBytesToRecv=%s",sMsgLen);//最后4个字节就就是后面报文的长度


   // 打出日志
   lr_output_message("sMsgLen=[%s],   NumberOfBytesToRecv==[%s]",sMsgLen,szBytesLength);


    //接收后面的报文体
    rc = lrs_receive_ex(sock_desc, buf_desc, szBytesLength, LrsLastArg);

    if (rc != 0)//
    {
        lr_error_message("ERROR: 接收后续报文体错误   Error_code= %d", rc);
        return -1;
    }
    lrs_get_last_received_buffer(sock_desc, &buf, &buf_len);


    lr_output_message("报文体接收字节数=[%d]",buf_len);

    if (buf==NULL)
    {
        lr_error_message("接收报文体出错,BUFF为空[%s]", buf_desc);
        return -1;
    }


    //将报文体的内容复制到全局变量中
    memcpy(g_retmsg+g_headlen,buf,atoi(sMsgLen));
    g_retlen=atoi(sMsgLen)+g_headlen;

    lr_output_message("----------- RECICVER OK END-----------");
    return 0;

}


data.ws

loadruner <wbr>测试

模拟服务器:

loadruner <wbr>测试