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; }