ares444 发表于 2012-2-8 10:27:42

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

1、C/S架构,需要模拟多个客户端登陆到服务器,并发送TCP协议的长连接
2、建立长连接后服务端会一直推送消息给客户端(所以连接不能断)
3、客户端需要每30秒发送心跳给服务器。
4、若60秒内服务端没有收到心跳,会自动断掉该连接

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

请问如何保证收消息,且发送心跳呢

ares444 发表于 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;
}

ares444 发表于 2012-2-8 14:45:43

回复 4# aspstar

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

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

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

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

ares444 发表于 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;
}

ares444 发表于 2012-2-8 17:14:01

请高人指导下。。。

ggogw 发表于 2012-2-10 10:33:01

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

ares444 发表于 2012-2-11 19:22:57

lrs_set_receive_option(EndMarker, EndMarker_None);
你加了这个函数的话回放时若接收的数据与录制的肯定 ...
ggogw 发表于 2012-2-10 10:33 http://bbs.51testing.com/images/common/back.gif


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

yxd2006 发表于 2012-6-19 15:53:00

关注中……
页: [1]
查看完整版本: 如何实现在长连接中定期发送心跳?