Loadrunner Sokcet压力测试接收变长数据的处理

目前知道两种方式,我采用了第一种

1.分两次接受数据

参考http://blog.csdn.net/rachel_luo/article/details/7912468

第一次lrs_receive_ex接受与server约定好的保存长度的字节数,

我的case是前5个字节固定,其中前4个字节表示length,第5个字节表示type

于是我就调用lrs_receive_ex(sock_desc, buf_desc, "NumberOfBytesToRecv=5", LrsLastArg);

第一次先从接受缓冲区中读5个字节的数据出来

然后再调lrs_receive_ex(sock_desc, buf_desc, szBytesLength, LrsLastArg);

其中szBytesLength是从第一次接收的数据中计算出的后续部分的长度

这样就可以把整条数据分两次读完了

 

2.如果不需要知道数据的长度或者内容,可以一次接受完整条数据

参考http://blog.csdn.net/barebear/article/details/76713946

使用lrs_set_receive_option()这个函数即可

使用参考:

lrs_set_receive_option(EndMarker, EndMarker_None ) //读取直到缓冲结束。
lrs_set_receive_option(EndMarker, StringTerminator , "\r\n") //读取直到"\r\n"符号出现.你可以根据自己的接收数据的结束符修改。
lrs_set_receive_option(EndMarker, BinaryStringTerminator , "\\X00")读取直到二进制符号"\\X00"出现。
我没有尝试第二种方式,仅看函数来说应该是可行的,使用起来也比第一种方式简单很多,请酌情选用
 
附上action.c代码
#include "lrs.h"


int custom_lrs_receive(char *sock_desc, char *buf_desc, void *dummy)
{
    int rc;
    int buf_len = 5;
    int real_len;
    int j;
    char szBytesLength[300]="\0", *buf = NULL, *pszError, *pszLastChar;
    char cGetLen[5]="\0"; 

    //接收数据并将前5个字节放到buf_desc
    rc = lrs_receive_ex(sock_desc, buf_desc, "NumberOfBytesToRecv=5", LrsLastArg);
    
    //如果rc不为0,则表示接收数据失败,直接return -1
    if (rc != 0){
        lr_error_message("Receive 6 bytes failed. The error code = %d", rc);
        return -1;
    } 
    lr_end_transaction("json", LR_PASS);
    //获取buf的二进制长度
    //get length of buf, and put the number intobuf_len
    lrs_get_last_received_buffer(sock_desc, &buf, &buf_len);
    
    //容错,如果接收第一部分失败则返回
    if (buf == NULL || buf_len != 5){
        lr_error_message("receive of %s failed", buf_desc);
        lr_end_transaction("json", LR_FAIL);
        return -1;
    }
    
    real_len = fiFromHexBinToInt(buf) - 5;
    
    //将计算后的长度放入szBytesLength
    sprintf(szBytesLength, "NumberOfBytesToRecv=%d", real_len);  
    
    lr_debug_message(LR_MSG_CLASS_FULL_TRACE, "!!!! Bytes length = %s", szBytesLength);
    //再次接收后续的数据
    rc = lrs_receive_ex(sock_desc, buf_desc, szBytesLength, LrsLastArg);

    if (rc != 0) 
        return -1;
    
    return 0;
}

int fiFromHexBinToInt(char* szBuffer)
{
    return szBuffer[0]*256*256*256 + szBuffer[1]*256*256 + szBuffer[2]*256 + szBuffer[3]; 
}

Action()
{    
    int socket_receive_rc;

    lr_start_transaction("json");
    lrs_send("socket0", "buf0", LrsLastArg);
    socket_receive_rc = custom_lrs_receive("socket0", "buf1", LrsLastArg);    


    return 0;
}
View Code

 

posted on 2017-11-21 20:32  qooweds  阅读(351)  评论(0编辑  收藏  举报

导航