request

来源:互联网 发布:java T... 编辑:程序博客网 时间:2024/06/05 14:26
#ifndef _STOCK_REQUEST_H_#define _STOCK_REQUEST_H_ #include <deque> #include "config.h"#include "stock.h"#include "NBSocket.h" using namespace std; #pragma pack(push)#pragma pack(1) class Request{public: Request(); virtual void send(NBSocket * pSock);virtual ~Request();virtual charbuff() = 0;virtual ulong len() = 0; void SetSeqId(uint id);virtual void SetRequestInfoReqTimeInfo& stInfo ); private:uint seq_id;}; struct ReqHead{public:friend class Request;ReqHead(){};ReqHeadushort cmd_id, ushort packet_len/*the total packet len*/);ReqHeaduint iSeqId,  char iPacketType, ushort iPacketLen, ushort iCmdId );void set_len(ushort payload_len);ushort get_len();uint get_seq_id(); private:void set_seq_id(uint id); protected:char zip;// always 0x0c: data-uncompresseduint seq_id;// 同一种命令的 seq_id。char packet_type;// 00: 回应。 1,2,3... request countushort len;//数据长度ushort len1;//  数据长度重复ushort cmd;// b4 bf: 分钟线。。b5 bf 单笔成交}; // 0c  01  20 63 00 02  2字节长度 2字节长度  3e 05 05 00      00 00 00 00   00 00  06 00 class StockHeartBeat : public Request{public:charbuff();ulong len();private:struct StockHeartBeatStruct{StockHeartBeatStruct() : header(CMD_HEART_BEATsizeof(StockHeartBeatStruct)), count(1){memcpy(&stock_code[0],"000001"MarketInfo::StocksCodeLen);location = MarketInfo::get_market_location(&stock_code[0]);}ReqHeadheader;ushort count;char location;char stock_code[MarketInfo::StocksCodeLen];}s;};  //   0c 22 07 0a 00 01 0c 00 0c 00 24 05 00 00 00 00 00 00 1e 00 00 00class StockListReq : public Request{public:StockListReq(MarketInfo::MarketType market_code, ushort record_offset = 0, ushort record_count = 200, ushort record_total = 0);charbuff();ulong len();operator bool ();StockListReqoperator++();protected:struct StockListStruct{StockListStruct(MarketInfo::MarketType market_code, ushort record_offset, ushort record_count): header(CMD_STOCK_LISTsizeof(StockListStruct)),offset(record_offset), count(record_count),unknown1(0),unknown2(0){block = MarketInfo::get_block_from_market_type(market_code);}ReqHeadheader;ushort block;//  00 00 上A, 01 00 上B, 02 00 深A, 03 00 深B, 0x0d: 权证ushort unknown1;ushort offset;ushort count;ushort unknown2;}s;ushort total;};   class StockHoldChgReq : public Request{public: StockHoldChgReq(){}StockHoldChgReq(const string& stock_code){add_stock(stock_code);}charbuff();ulong len();bool add_stock(const string& stock_code);static const int max_stocks_a_request = 30;protected:struct StockHoldStruct{char market_locale;char stock_code[MarketInfo::StocksCodeLen];};struct StockHoldChgReqStruct{StockHoldChgReqStruct() : header(CMD_STOCKHOLD_CHANGE, 0), count(0){}bool add_one_stock(const string& stock_code){if(count >= max_stocks_a_request)return false; s_buff[count].market_locale = MarketInfo::get_market_location(stock_code);memcpy(&s_buff[count].stock_code, stock_code.c_str(), MarketInfo::StocksCodeLen);count++;header.set_lensizeof(StockHoldStruct) * count + 4); return true;}ReqHeadheader;ushort count;StockHoldStruct s_buff[max_stocks_a_request];}s; }; /*获取股票数量 深市发送0c 0c 18 6c 00 01 08 00 08 00 4e 04 00 00 75 c7 33 01接收Bc cb 74 00 0c 0c 18 6c 00 00 4e 04 02 00 02 00 e7 19In [61]: 0x19e7Out[61]: 6631沪市发送0c 0c 18 6c 00 01 08 00 08 00 4e 04 01 00 75 c7 33 01接收Bc cb 74 00 0c 0c 18 6c 00 00 4e 04 02 00 02 00 b3 33In [63]: 0x333bOut[63]: 13115 */ class GetStockCountReq : public Request{public:GetStockCountRequchar cReqMarket ) : s( cReqMarket ){}charbuff();ulong len();private:struct GetStockCountReqStruct{GetStockCountReqStructuchar cReqMarket ) : header( 0, PKT_TYPE_REQUESTsizeof ( GetStockCountReqStruct ), CMD_GET_STOCK_COUNT ),cMarket( cReqMarket ), cPack(0x00) , iPostFix(POSTFIX_GET_STOCK_COUNT){}ReqHeadheader;uchar cMarket;uchar cPack;uint iPostFix;}s;}; /*获取股票实时行情 深市发送0c 01 00 00 00 02 13 00 13 00 3e 05  05 00 00 00 00 00 00 00 01 00 00 30 30 30 30 30 31接收b1 cb 74 0 c 1 0 0 0 0 3e 5 53 0 53 0 64 4c 1 0 0 30 30 30 30 31 6e e bb 11 10 c c 46 85 87 ef d fb 11 97 f8 36 b6 1 9a 2f f6 4d 87 aa 1f 90 ce 17 1 a7 d 0 1 99 e 95 2f 41 2 88 1 95 18 42 3 b2 2b a4 c 43 4 8d 20 b0 4 44 5 8c 4b 8b f 8 11 0 1c 20 9 11 0 6e e  */ class GetStockQuotesReq : public Request{public:GetStockQuotesReqconst vector<QuotePara>& vecPara );charbuff();ulong len();private:struct GetStockQuotesReqStruct{GetStockQuotesReqStructconst vector<QuotePara>& vecPara );ReqHeadheader;uchar sPack[10];char sPara[4096];ulong lParaLen;}s;}; /* pkg = bytearray.fromhex(u'0c 1b 08 00 01 01 0e 00 0e 00 1d 05')        pkg.extend(struct.pack("<H6sI", market, code, 0))        self.send_pkg = pkg 发送 0c 1b 08 00 01 01 0e 00 0e 00 1d 05  00 00    30 30 30 30 30 31  00 00 00 00 获取分时行情*/ class GetMinuteTimeDataReq : public Request{public:GetMinuteTimeDataReq(  ushort iReqMarket, const  char* sReqStockCode  ) :  s( iReqMarket, sReqStockCode ){}charbuff();ulong len();private:struct GetMinuteTimeDataReqStruct{GetMinuteTimeDataReqStructushort iReqMarket, const  char* sReqStockCode );ReqHeadheader;ushort iMarket;uchar sStockCode[6];uint iPack;}s;}; /* pkg = bytearray.fromhex(u'0c 1b 08 00 01 01 0e 00 0e 00 1d 05')        pkg.extend(struct.pack("<H6sI", market, code, 0))        self.send_pkg = pkg 获取历史分时行情*/ class GetHisMinuteTimeDataReq : public Request{public:GetHisMinuteTimeDataReq(  uint iDate, uchar cReqMarket, const  char* sReqStockCode  ) :  s( iDate, cReqMarket, sReqStockCode ){}charbuff();ulong len();private:struct GetHisMinuteTimeDataReqStruct{GetHisMinuteTimeDataReqStructuint iDate, uchar cReqMarket, const  char* sReqStockCode );ReqHeadheader;uint iDate;uchar cMarket;uchar sStockCode[6];}s;}; /* def setParams(self, market, code, start, count):        if type(code) is six.text_type:            code = code.encode("utf-8")        pkg = bytearray.fromhex(u'0c 17 08 01 01 01 0e 00 0e 00 c5 0f')        pkg.extend(struct.pack("<H6sHH", market, code, start, count))        self.send_pkg = pkg 获取分时成交*/ class GetTransactionDataReq : public Request{public:GetTransactionDataReq(  ushort iReqMarket, const  char* sReqStockCode, ushort  iStart, ushort iCount   ) :  s( iReqMarket,   sReqStockCode, iStart, iCount ){}charbuff();ulong len();private:struct GetTransactionDataReqStruct{GetTransactionDataReqStructushort cReqMarket, const  char* sReqStockCode, ushort iStart, ushort iCount );ReqHeadheader;ushort iMarket;uchar sStockCode[6];ushort iStart;ushort iCount;}s;};  /* class GetHistoryTransactionData(BaseParser):    def setParams(self, market, code, start, count, date):        if type(code) is six.text_type:            code = code.encode("utf-8")        if type(date) is (type(date) is six.text_type) or (type(date) is six.binary_type):            date = int(date)        pkg = bytearray.fromhex(u'0c 01 30 01 00 01 12 00 12 00 b5 0f')        pkg.extend(struct.pack("<IH6sHH", date, market, code, start, count))        self.send_pkg = pkg 获取历史分时成交*/ class GetHisTransactionDataReq : public Request{public:GetHisTransactionDataReq(  uint iDate, ushort iReqMarket, const  char* sReqStockCode, ushort  iStart, ushort iCount   ) :  s( iDate, iReqMarket,   sReqStockCode, iStart, iCount ){}charbuff();ulong len();private:struct GetHisTransactionDataReqStruct{GetHisTransactionDataReqStructuint iDate, ushort iReqMarket, const  char* sReqStockCode, ushort iStart, ushort iCount );ReqHeadheader;uint iDate;ushort iMarket;uchar sStockCode[6];ushort iStart;ushort iCount;}s;}; /*     def setParams(self, category, market, code, start, count):        if type(code) is six.text_type:            code = code.encode("utf-8")        self.category = category        values = (            0x10c,            0x01016408,            0x1c,            0x1c,            0x052d,            market,            code,            category,            1,            start,            count,            0, 0, 0  # I + I +  H total 10 zero        )        pkg = struct.pack("<HIHHHH6sHHHHIIH", *values)        self.send_pkg = pkg 获取指数k线*/ class GetIndexBarsReq : public Request{public:GetIndexBarsReq(  ushort iCategory, ushort iReqMarket, const  char* sReqStockCode, ushort  iStart, ushort iCount   ) :  s( iCategory, iReqMarket,   sReqStockCode, iStart, iCount ),m_iCategory( iCategory ){}charbuff();ulong len();virtual void SetRequestInfoReqTimeInfo& stInfo );private:struct GetIndexBarsReqStruct{GetIndexBarsReqStructushort iCategory, ushort iReqMarket, const  char* sReqStockCode, ushort iStart, ushort iCount );ReqHeadheader;ushort iMarket;uchar sStockCode[6];ushort iCategory;ushort iPack1;ushort iStart;ushort iCount;char sPack[10];}s;int m_iCategory;};  #pragma pack(pop) typedef shared_ptr<RequestCmdData_t;typedef deque<CmdData_t > CmdQueue_t;  #endif 
#include "stdafx.h"#include "config.h" #include <vector>#include <set>#include <map>#include <iostream>  #include "tcpSocket.h"#include "stock.h"#include "request.h"#include "util.hpp" #define REQ_BUF_FUNC_IMP(sClassName) char* sClassName::buff()\{\return (char*)&s;\} #define REQ_LEN_FUNC_IMP(sClassName) ulong sClassName::len()\{\return sizeof(s);\}  Request::Request(){} void Request::SetSeqId(uint id){seq_id = id;}  void Request::send(NBSocket * pSock){ReqHead* pHead = (ReqHead*)buff();pHead->set_seq_id(seq_id); string sNow;getNowStr( sNow ); //cout << sNow << ":NBSocket Send:"  << get_raw_string( string((char*)buff(), len() ) )  << endl; pSock->Send(buff(), len());}  Request::~Request(){} void Request::SetRequestInfoReqTimeInfo& stInfo ){}   ReqHead::ReqHeadushort cmd_id, ushort packet_len/*the total packet len*/ = 0){zip = 0x0c;seq_id = 0;packet_type = 1;len = len1 = packet_len - sizeof(ReqHead) + 2;cmd = cmd_id;} ReqHead::ReqHeaduint iSeqId,  char iPacketType, ushort iPacketLen, ushort iCmdId ){zip = 0x0c;seq_id = iSeqId;packet_type = iPacketType;len = len1 = iPacketLen - sizeof(ReqHead) + 2;cmd = iCmdId;} uint ReqHead::get_seq_id(){return seq_id;} void ReqHead::set_seq_id(uint id){seq_id = id;} void ReqHead::set_len(ushort payload_len){len = len1 = payload_len;} ushort ReqHead::get_len(){return len;} REQ_BUF_FUNC_IMP(StockHeartBeat) ulong StockHeartBeat::len(){return sizeof(StockHeartBeatStruct);} StockListReq::StockListReq(MarketInfo::MarketType market_code, ushort record_offset, ushort record_count, ushort record_total): s(market_code, record_offset, record_count), total(record_total){if(0 == record_total){total = record_count;}} REQ_BUF_FUNC_IMP(StockListReq) ulong StockListReq::len(){return sizeof(s);} StockListReq::operator bool (){return s.offset < total;}StockListReqStockListReq::operator ++ (){if(s.offset + s.count < total){s.offset = s.offset + s.count ;s.count = (total - s.offset) > s.count ? s.count : (total - s.offset);}else{s.offset = total;}return *this;} charStockHoldChgReq::buff(){return (char*)&s;}ulong StockHoldChgReq::len(){return sizeof(ReqHead) + sizeof(ushort) + sizeof(StockHoldStruct) * s.count;}bool StockHoldChgReq::add_stock(const string& stock_code){return s.add_one_stock(stock_code);}  REQ_BUF_FUNC_IMP(GetStockCountReq)REQ_LEN_FUNC_IMP(GetStockCountReq) REQ_BUF_FUNC_IMP(GetStockQuotesReq) GetStockQuotesReq::GetStockQuotesReqconst vector<QuotePara>& vecPara ): s( vecPara ){s.header.set_len(  sizeof( s.sPack ) +  s.lParaLen + 2 ) ;} GetStockQuotesReq::GetStockQuotesReqStruct::GetStockQuotesReqStructconst vector<QuotePara>& vecPara ) : header( 0, PKT_TYPE_QUOTES, 0, CMD_GET_STOCK_QUOTES ){memset( sPack, 0, sizeof( sPack ) );sPack[0]=(uchar)0x05;sPack[8]=(uchar)0x01;string sParaList;vector<QuotePara>::const_iterator itr = vecPara.begin();for ( ; itr != vecPara.end(); ++itr ){sParaList.append( 1, (char)itr->cMarket );sParaList.append( string( itr->sStockCode, sizeof( itr->sStockCode) ) );}lParaLen = sParaList.length();//cout << "lParaLen is " << lParaLen << ", sizeof( sPara ) is  " << sizeof( sPara )   << endl;if ( lParaLen < sizeof( sPara )  ){memcpy( sPara, sParaList.c_str(), lParaLen );}else{lParaLen = 0;memset( sPara, 0, sizeof( sPara )  );}}  ulong GetStockQuotesReq::len(){return  sizeof ( ReqHead )  + sizeof( s.sPack ) +  s.lParaLen ;}  REQ_BUF_FUNC_IMP(GetMinuteTimeDataReq)REQ_LEN_FUNC_IMP(GetMinuteTimeDataReq) GetMinuteTimeDataReq::GetMinuteTimeDataReqStruct::GetMinuteTimeDataReqStructushort iReqMarket, const  char* sReqStockCode ) : header( 0, PKT_TYPE_REQUESTsizeof (  GetMinuteTimeDataReqStruct ), CMD_GET_MINUTE_DATA ),iMarket( iMarket ),iPack(0){strncpy( (char*)sStockCode, (char*)sReqStockCode, sizeof( sStockCode ) );} REQ_BUF_FUNC_IMP(GetHisMinuteTimeDataReq)REQ_LEN_FUNC_IMP(GetHisMinuteTimeDataReq) GetHisMinuteTimeDataReq::GetHisMinuteTimeDataReqStruct::GetHisMinuteTimeDataReqStructuint iReqDate, uchar cReqMarket, const  char* sReqStockCode ) : header( 0, PKT_TYPE_REQUESTsizeof (  GetHisMinuteTimeDataReqStruct ), CMD_GET_HIS_MINUTE_DATA ),iDate( iReqDate ), cMarket( cMarket ) {strncpy( (char*)sStockCode, (char*)sReqStockCode, sizeof( sStockCode ) );} REQ_BUF_FUNC_IMP(GetTransactionDataReq)REQ_LEN_FUNC_IMP(GetTransactionDataReq) GetTransactionDataReq::GetTransactionDataReqStruct::GetTransactionDataReqStructushort iReqMarket, const  char* sReqStockCode,  ushort iReqStart, ushort iReqCount  ): header( 0,  PKT_TYPE_REQUESTsizeof (  GetTransactionDataReqStruct ), CMD_GET_TRANSACTION_DATA ),iMarket( iReqMarket ), iStart( iReqStart ), iCount( iReqCount ){strncpy( (char*)sStockCode, (char*)sReqStockCode, sizeof( sStockCode ) );} REQ_BUF_FUNC_IMP(GetHisTransactionDataReq)REQ_LEN_FUNC_IMP(GetHisTransactionDataReq) GetHisTransactionDataReq::GetHisTransactionDataReqStruct::GetHisTransactionDataReqStructuint iReqDate, ushort iReqMarket, const  char* sReqStockCode,  ushort iReqStart, ushort iReqCount  ): header( 0,  PKT_TYPE_REQUESTsizeof (  GetHisTransactionDataReqStruct ), CMD_GET_HIS_TRANSACTION_DATA ),iDate(iReqDate), iMarket( iReqMarket ), iStart( iReqStart ), iCount( iReqCount ){strncpy( (char*)sStockCode, (char*)sReqStockCode, sizeof( sStockCode ) );} REQ_BUF_FUNC_IMP(GetIndexBarsReq)REQ_LEN_FUNC_IMP(GetIndexBarsReq) GetIndexBarsReq::GetIndexBarsReqStruct::GetIndexBarsReqStructushort iReqCategory, ushort iReqMarket, const  char* sReqStockCode, ushort  iReqStart, ushort iReqCount  ): header( 0,  PKT_TYPE_REQUESTsizeof (  GetIndexBarsReqStruct ), CMD_GET_INDEX_BARS ),iMarket( iReqMarket ),iCategory(iReqCategory), iPack1(1), iStart( iReqStart ), iCount( iReqCount ){strncpy( (char*)sStockCode, (char*)sReqStockCode, sizeof( sStockCode ) );memset( sPack, 0, sizeof( sPack ) ); } void GetIndexBarsReq::SetRequestInfoReqTimeInfo& stInfo ){stInfo.iCategory = m_iCategory;}  
原创粉丝点击