51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7890|回复: 7
打印 上一主题 下一主题

[求助] 如何实现在长连接中定期发送心跳?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-2-8 10:27:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、C/S架构,需要模拟多个客户端登陆到服务器,并发送TCP协议的长连接
2、建立长连接后服务端会一直推送消息给客户端(所以连接不能断)
3、客户端需要每30秒发送心跳给服务器。
4、若60秒内服务端没有收到心跳,会自动断掉该连接

现在我的问题是,使用lrs_receive接收消息时,由于服务端会一直推送消息,导致lrs_receive可能会执行很长时间。
这样就不能及时发送心跳了。。导致连接被断开

请问如何保证收消息,且发送心跳呢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2012-2-8 10:42:22 | 只看该作者
本帖最后由 ares444 于 2012-2-8 12:42 编辑

以下是我的脚本

#include "lrs.h"


Action()
{
        /*与网关建立Socket*/
        int sc =0;
        int i=0;
        lrs_create_socket("socket1", "TCP", "RemoteHost=10.1.91.36:5001", LrsLastArg);
        if(sc == 0)         
                lr_output_message("Socket was successfully created!");
        else
                lr_output_message("An error occurred while creating the socket,Error Code: %d",sc);


    lr_start_transaction("message");
        /*连接初始化请求*/
                lrs_send("socket1", "buf1", LrsLastArg);
                /*发送测试订阅行情到行情网关*/
                lrs_send("socket1", "buf2", LrsLastArg);
                lrs_receive("socket1", "buf3", LrsLastArg);
        lr_end_transaction("message", LR_AUTO);
   lr_start_transaction("HeartBeat");
                /*每10秒发一次心跳*/
           for(i=0;i<100;i++)
            {
                   lrs_send("socket1", "buf0", LrsLastArg);
                        sleep(10000);
            }
                lrs_close_socket("socket1");
    lr_end_transaction("HeartBeat", LR_AUTO);


        return 0;
}
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2012-2-8 14:45:43 | 只看该作者
回复 4# aspstar

我们的场景是这个样子的,一共3个部件:
客户端(LR模拟)
网关(待测系统)
行情服务器(模拟桩)

1、客户端先与网关建立连接,然后发送订阅行情消息
2、网关将订阅行情信息发给行情服务器
3、行情服务器推送行情数据给网关(根据业务要求行情数据的推送速度是恒定的,如1条/秒)
4、网关根据每个客户端订阅行情数据的品种不同,分别将处理过的行情数据 发给各个客户端
5、客户端需要每隔30秒发送一个心跳消息给网关,若60秒网关仍未收到心跳,则会断开建立的长连接

从这里可以看出,客户端越多,网关的压力就会成倍的增加
而客户端会一直持续的收到网关推送过来的行情数据

这样,就造成了用lr写脚本时,会卡在lrs_receive这步,从而导致长连接被断开
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2012-2-8 14:54:18 | 只看该作者
我现在将脚本改成了如下:
奇迹的是不报超时了,但是会提示收到的消息长度不匹配(因为我无法判断收到的消息长度,所以我也不知道怎弄)
Mismatch (expected 1 bytes, 2133 bytes actually received)
这行提示信息虽说不影响测试结果,但是看着不爽啊。。
请高人指点下。。。如何优化

#include "lrs.h"


Action()
{
        /*与网关建立Socket*/
        int sc =0;
        int i=0;
        lrs_create_socket("socket0", "TCP", "RemoteHost=10.1.91.36:5001", LrsLastArg);
        if(sc == 0)         
                lr_output_message("Socket was successfully created!");
        else
                lr_output_message("An error occurred while creating the socket,Error Code: %d",sc);

                 //连接初始化请求0x11
         lrs_send("socket0", "buf1", LrsLastArg);
                 //发送测试订阅行情到行情网关0x21
         lrs_send("socket0", "buf2", LrsLastArg);
                 //think time
                 lr_think_time(0.3);

while(1)

     {

         lr_start_transaction("test");
                 //向网关发送心跳
         lrs_send("socket0", "buf0", LrsLastArg);

                 lrs_set_receive_option(EndMarker, EndMarker_None);
                 //客户端接收行情数据
         lrs_receive("socket0", "buf3", LrsLastArg);

         lr_end_transaction("test", LR_PASS);

         //think time
         lr_think_time(0.3);

    }


        return 0;
}
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2012-2-8 17:14:01 | 只看该作者
请高人指导下。。。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2019-2-1 16:33
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    6#
    发表于 2012-2-10 10:33:01 | 只看该作者
    lrs_set_receive_option(EndMarker, EndMarker_None);
    你加了这个函数的话回放时若接收的数据与录制的肯定会报那个不匹配信息。
    你说的那个案例实际应用中客户端发送心跳包与从网关获取行情数据应该是并行处理的。但是脚本运行是接收完毕才执行下次循环,就会存在那种那种若是30S没接收完,还没发心跳包的情况。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
     楼主| 发表于 2012-2-11 19:22:57 | 只看该作者
    lrs_set_receive_option(EndMarker, EndMarker_None);
    你加了这个函数的话回放时若接收的数据与录制的肯定 ...
    ggogw 发表于 2012-2-10 10:33



        对的,但是如何并行处理?C++怎么多线程啊。。我不太懂
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2012-6-19 15:53:00 | 只看该作者
    关注中……
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 05:37 , Processed in 0.072597 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表