通用服務器樁-Receiver使用說明文檔

發表于:2012-11-06來源:百度質量部作者:不詳點擊數: 標簽:Receiver
通用服務器樁-Receiver使用說明文檔 1 背景 “驅動+樁”是一種比較成熟的服務器端模塊測試模式,易于實施自動化。

  通用服務器樁-Receiver使用說明文檔

  1 背景

  “驅動+樁”是一種比較成熟的服務器端模塊測試模式,易于實施自動化。

  Receiver應用于樁構建的場景,提高構建服務器端測試樁的效率,在大多數應用場景下用戶可以通過配置xml文件實習樁功能,支持功能和性能測試使用

  Receiver只支持linux環境使用

  2 名詞解釋

  A模式: 普通xml解析模式

  B模式: 邏輯xml解析模式

  C模式: so加載模式

  3 功能

   ※能夠模擬提供二進制socket接口的服務器程序

   ※能夠支持功能與性能的要求

   ※提供三種使用模式:

  (1) 普通xml解析模式(模擬單個接口,指定接口格式及回報數據)

  (2) 邏輯xml解析模式(模擬多個接口,除指定接口格式及回報數據外,定制部分邏輯)

  (3) so加載模式(特殊場景使用,用戶可以自己實現包處理函數)

  ※ 提供各類輔助函數, 幫助更快速的開發樁程序

  4 使用說明

  4.1 普通xml模式

  假設一個服務器模塊提供的某個socket接口請求格式為header+req1,回包格式為header+resp1,struct描述如下:

  struct header{

  int cmd;

  char provider[200];

  int len;

  };

  struct req1{

  int id;

  };

  Struct item{

  Int a;

  Int b;

  };

  struct resp1{

  int result;

  char name[50];

  int count;

  struct item items[];

  };

  那么我們需要先構造三個xml描述

   ※header1.xml

   ※req1.xml

  ※ resp1.xml

  注:endian用來描述字節序,0為主機序(默認)

  Repeat用于指定該數據段重復數字,用于數組定義,也可以用在struct的描述上

  Type為該字段類型,工具內置類型見附錄

  #flowlen()為內置函數,指定此處自動計算,根據后面所有結構體的長度計算,其他關鍵字見附錄

  $TEMPRESULT表示從環境變量TEMPRESULT中讀取數據

  @count 表示該字段值由值反填,也就是5

  回包值可以指定固定值、從環境變量中讀取或者利用random內置函數隨機生成

  運行receiver:./receiver –p 3306 –r ./header.xml –r req1.xml –s header.xml –s resp1.xml -l 1 -u 0 -n -1 即可模擬這個服務器的接口

  那么當receiver收到一個header+req1的請求,它會回一個header+resp1的應答(result為對應系統變量實際值,name 為hello world),-l 1表示長連接, -u 0 表示tcp請求, -n -1 表示receiver不會退出,一直處理請求

  4.2 邏輯xml模式

  上個例子給出了模擬一個服務器程序單一接口的使用方法,邏輯xml主要用于模擬一個程序多個接口的場景。

  假設說某模塊提供的接口格式如下:

  header1+header2+reqX

  回包格式為:

  header1+header2+respX

  (X為未知數,具體請求與回應的結構體由header2中的cmd域來定義,例如如果cmd取值為5,則請求為header1+header2+req5,回應為header1+header2+resp5)

  我們想啟動一個樁實例來模擬這些接口,那么可以使用邏輯xml模式,邏輯xmll的使用方法如下:

  首先構造邏輯xml:

  [gaowei@db-testing-cs33.db01.baidu.com receiver]$ cat xml/config.xml

  運行receiver:./receiver –p 3306 –b config.xml -l 1 -u 0 -n -1 –t 5即可模擬這個服務器的多個接口

  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\n”);

  }

  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),參數含義如下:

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97