⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cframe.h

📁 多播服务器的c++源代码实现!实现了在windows平台用api编译的多播/组播编写方式的代码.
💻 H
字号:
#include <stdlib.h>
#include <string.h>
#include <ace/ACE.h>
#include <ace/CDR_Base.h>
#include <ace/OS.h>

#pragma once

/**
* @name 主帧号定义
* @{
* 主帧号
* 帧号分配说明:
* 背景资料(盘前数据)类帧0x0080—0x008f;
* 行情报价类帧0x0090—0x00af
* 指标类帧0x00b0—0x00cf
* 控制类帧0x00d0—0x00ef
* 资讯类帧0x00f0—0x00ff
*/

#define FRM_MARKET_DATA 								0x0092   // 4.	盘中快照

/**
* @name Tag定义
* @{
*/

#define TAG_INTERNAL_CODE					0x00	// 内码	Dword	4	
// #define TAG_TRADE_INDEX_B					0x01	// 成交序号	byte	1	
   #define TAG_TRADE_INDEX_DW					0x02	// 成交序号	dword	4	
#define TAG_TRADE_TIME						0x03	// 交易时间	LongTime	4	
#define TAG_TIME_STAMP						0x04	// 时间戳	Timestamp	8	数据产生时间
#define TAG_NEW_PRICE_W						0x05	// 最新价	word	2	
#define TAG_NEW_PRICE_D						0x06	// 最新价	Dword	4	
#define TAG_NEW_BID_VOL_W					0x07	// 最新成交数量	word	2	
#define TAG_NEW_BID_VOL_D					0x08	// 最新成交数量	Dword	4	
#define TAG_NEW_BID_VOL_L					0x09	// 最新成交数量	8字节	8	
#define TAG_NEW_BID_PRICE_W					0x0a	// 最新成交金额	word	2	
#define TAG_NEW_BID_PRICE_D					0x0b	// 最新成交金额	Dword	4	
#define TAG_NEW_BID_PRICE_L					0x0c	// 最新成交金额	8字节	8	
#define TAG_PRE_CLOSE_PRICE_W				0x0d	// 昨收盘价	word	2	
#define TAG_PRE_CLOSE_PRICE_D				0x0e	// 昨收盘价	Dword	4	
#define TAG_OPEN_PRICE_W					0x0f	// 开盘价	word	2	
#define TAG_OPEN_PRICE_D					0x10	// 开盘价	Dword	4	
#define TAG_HIGH_PRICE_W					0x11	// 最高价	word	2	
#define TAG_HIGH_PRICE_D					0x12	// 最高价	Dword	4	
#define TAG_LOW_PRICE_W						0x13	// 最低价	word	2	
#define TAG_LOW_PRICE_D						0x14	// 最低价	Dword	4	
#define TAG_COMMISSIONED_PRICE				0x15	// 最好委托价格标识	byte	1	
#define TAG_BUY_PRICE_VOL_NUMBER			0x16	// 申买价量个数			
#define TAG_BUY_PRICE_W						0x17
#define TAG_BUY_PRICE_D						0x18    //申买价
#define TAG_BUY_VOL_D						0x19
#define TAG_BUY_VOL_L						0x1a    //申买量
#define TAG_SALL_PRICE_VOL_NUMBER           0x1c    // 申卖价量个数	
#define TAG_SALL_PRICE_W					0x1d
#define TAG_SALL_PRICE_D					0x1e    //申卖价
#define TAG_SALL_VOL_D						0x1f
#define TAG_SALL_VOL_L						0x20    //申卖量
#define TAG_TRADE_TOTAL_NUMBER              0x24    //成交总量


		 /** @}*/// Tag定义

// 帧最大大小
#define FRAME_SIZE_MAX			8192
#define FRAME_CNT_MAX			6144
#define FRAME_DATA_START_POSI	6

// 帧头/帧尾标记
#define STX						2
#define ETX						3

struct XTimeStamp
{
	union
	{
		struct
		{
			unsigned ms 	: 10;
			unsigned sec	: 6;
			unsigned min	: 6;
			unsigned hour	: 5;
			unsigned day	: 5;
			unsigned mon	: 4;
			unsigned year	: 15;
			unsigned pad	: 13;
		};
		char ph[8];
	};

	XTimeStamp(int year , int month, int day , int hour ,
				int min , int sec , int ms=0, int pad=0)
	{
		this->year	= year;
		this->mon	= month;
		this->day	= day;
		this->hour	= hour;
		this->min	= min;
		this->sec	= sec;
		this->ms	= ms;
		this->pad	= pad;
	}

	XTimeStamp()
	{
		this->year	= 0;
		this->mon	= 0;
		this->day	= 0;
		this->hour	= 0;
		this->min	= 0;
		this->sec	= 0;
		this->ms	= 0;
		this->pad	= 0;
	}
	XTimeStamp& operator=(const XTimeStamp &Item)
	{
		this->year	= Item.year;
		this->mon	= Item.mon;
		this->day	= Item.day;
		this->hour	= Item.hour;
		this->min	= Item.min;
		this->sec	= Item.sec;
		this->ms	= Item.ms;
		this->pad	= Item.pad;

		return *this;
	}
};

typedef struct stQuickDataStrc
{

	ACE_CDR::ULong	dwInternal;			//内码
	XTimeStamp tTimeStamp;//时间戳
	long	dwClosePrice;		//昨收盘价
	long	dwOpenPrice;		//开盘价
	long	dwHighPrice;		//最高价
	long	dwlowPrice;			//最低价
	long	dwNewPrice;			//最新价
	ACE_CDR::ULong	dwTradeTime;	//交易时间
	unsigned char		bFlag1;				//最好委托价格标识
	unsigned char		bBidPriceLevel;		//申买价量个数
	long	dwBidPx[5];		//申买价
	long long   llBidSize[5];	//申买量
	unsigned char       bSallBidPriceCount;  //申卖价量个数
	long	dwOfferPx[5];		//申卖价
	long long   llOfferSize[5];	//申卖量
	long    llTradeTotal;      //成交总量
	
} QuickDataStrc;

//包的总数、当前包号

class CFrame
{
public:
  CFrame ()
  {
    memset (pchDataCache, 0, sizeof (ACE_CDR::Char) * FRAME_SIZE_MAX);
    pshFrameLen =
      (ACE_CDR::UShort *) (pchDataCache + sizeof (ACE_CDR::UShort) * 2);
    m_frameLen = 0;
    //
    //TODO: 在此处添加构造函数代码
    //
  }
   ~CFrame ()
  {
  }

public:
  int AddHead (ACE_CDR::UShort wFrameId, ACE_CDR::UShort wSign);
  int AddData (ACE_CDR::UShort wDataId, ACE_CDR::UShort dDataId,
	       ACE_CDR::UShort wDataLen, ACE_CDR::Char * pchDataValue);
  ACE_CDR::Char * GetDataBuf (void);
  ACE_CDR::UShort GetDataLen (void);
  void AddCrcCheckSum ();
  void TranslateData ();
private:
  ACE_CDR::Char pchDataCache[FRAME_SIZE_MAX];	//帧的数据字段和校验字段缓冲
  ACE_CDR::Char m_frameBuffer[FRAME_SIZE_MAX];	//帧数据缓冲
  ACE_CDR::UShort * pshFrameLen;	//指向帧数据长度的指针
  ACE_CDR::UShort m_frameLen;	//可变帧的帧长度
};

//typedef int (*Fuc_SendFrmData)(const void *pchDataFuf, ACE_CDR::UShort ushDataLen);

class CCreateFrame
{
public:
  CCreateFrame (int cnt_max = FRAME_CNT_MAX)
  {  
    pFrmData = NULL;
    //SendFrmData = parSendFrmData;
    //
    //TODO: 在此处添加构造函数代码
    //
  }
   ~CCreateFrame ()
  {
    if (pFrmData != NULL)
      {
	delete  pFrmData;
	pFrmData = NULL;
      }
  }
public:
  //void SetFrmCutLen(ACE_CDR::UShort pshLen); //设置分割内容帧的长度
  template < typename SendFunc > void SendFrm ();	//发送新建的帧
  bool CreateNewsFrm (QuickDataStrc * pNwTrans);	//创建新闻帧 
 
private:
  void PackNewsTitleFrm (CFrame * pFrm, QuickDataStrc * pNwTrans);
 
public: 
  CFrame *pFrmData;		//帧数组 
 
};

/*
*组播帧数据
*/
template < typename SendFunc > void
CCreateFrame::SendFrm ()
{
  ACE_CDR::Char * pchDataBuf = NULL;
  ACE_CDR::UShort ushLen;
  if (pFrmData == NULL)
    {
      return;
    }
  
      //获得帧数据和长度
      pchDataBuf = pFrmData[n].GetDataBuf ();
      ushLen = pFrmData[n].GetDataLen ();

      //发送组播数据pchDataBuf, 长度ushLen
      SendFunc ()((void *) pchDataBuf, ushLen);
 

  //清除原有的帧
  delete[]pFrmData;
  pFrmData = NULL;
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -