4.3 so模式

  如果以上两种方式不能满足用户需求,用户可以继承receiver提供的plugin基类,实现自己的包处理函数

  class IPlugin

  {

  public:

  IPlugin( const std::string& name) ;

  virtual ~IPlugin();

  virtual const std::string& GetPluginName();

  virtual void Process( void *);

  protected:

  std::string m_strPluginName;

  };

  Receiver使用了Epool和线程池模型,当有socket可读,会立刻回调用户的Process( void *)函数,传给用户socket句柄,用户可自行执行收包及处理函数

  一个简单示例如下:

  testplugin.h:

  #include “plugin.h”

  class TestPlugin: public IPlugin{

  public:

  TestPlugin():IPlugin(“testplugin”){

  printf(“create TestPlugin ”);

  }

  void Process( void *);

  };

  testplugin.cpp:

  #include “testplugin.h”

  #include “mysocket.h”

  #include

  using namespace std;

  extern “C”

  TestPlugin* create_testplugin()

  {

  return new TestPlugin();

  }

  void TestPlugin::Process(void * p){

  int sock = (int)p;

  cout << ” handle epool event , socket= ” << sock << endl;

  SocketLayer::close_delepoll(sock);

  }

  5 工具参数

  receiver三种模式: xml模式(A),逻辑xml模式(B),so模式(C),参数含义如下:

    -r 指定接收的结构体描述,A模式使用

   -s 指定发送的普通结构体描述,A模式使用

   -m 指定发送的mcpack1结构体描述,A模式使用

   -x 指定发送的mcpack2结构体描述,A模式使用

   -S 指定延迟发送时间,A、B模式使用

   -n 指定响应次数(-1 表示不退出),A、B模式使用

   -l 指定处理请求后是否断连接,A、B模式使用

   -u 指定是否为udp,A、B模式使用

   -b 指定一个逻辑xml,B模式使用

   -d 指定自定义so路径,C模式使用

   -a 指定自定义so名称,C模式使用

   -t 指定线程数,A、B、C模式使用

   -p 指定端口号,A、B、C模式使用

  6 附录

  6.1 关键字列表

   #randuint(a,b):返回从a到b之间的一个随机数

   #timenow():返回当前时间的秒数

   #md5(16,str):根据str生成md5

   #fromto(a,b):返回[a,b]的整数,随运行次数递增

   #randin(a,b,c,d):在abcd中随机抽一个数

   flowlen():计算后续部分的长度

  6.2 内置类型

   int8_t uint8_t

   int16_t uint16_t

   int32_t uint32_t

   int64_t uint64_t

   int

   time_t

   long

   short

   char