zoukankan      html  css  js  c++  java
  • 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 , " ") //读取直到" "符号出现.你可以根据自己的接收数据的结束符修改。
    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]="", *buf = NULL, *pszError, *pszLastChar;
        char cGetLen[5]=""; 
    
        //接收数据并将前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
  • 相关阅读:
    自己动手将整数转换字符串
    自己动手实现字符串倒叙
    欧拉计划第13题题解
    洛谷P1016 旅行家的预算 题解 贪心+单调队列
    欧拉计划第12题题解
    欧拉计划第11题题解
    欧拉计划第10题题解
    欧拉计划第9题题解
    欧拉计划第8题题解
    欧拉计划第7题题解
  • 原文地址:https://www.cnblogs.com/qooweds/p/7875194.html
Copyright © 2011-2022 走看看