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

📄 request.cpp

📁 通信达接口引警 可直接下载股票数据,建立自已的股票软件
💻 CPP
字号:

#include "config.h"

#include <vector>
#include <set>
#include <map>
#include <queue>

#include <boost/thread/detail/config.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>


#include "tcpSocket.h"
#include "stock.h"
#include "request.h"

namespace StockMarket
{
	recursive_mutex req_queue_mutex;

	uint Request::seq_id = 1;
	bool Request::received = true;
	Request::Request() : first(true)
	{}
	Request::operator bool ()
	{
		if(first) 
		{
			first = false;
			return true;
		}
		else
		{
			return false;
		}
	}
	void Request::res_seq_id(uint id)
	{
		// 只有收到较后面的时候,才设置新值
		// ( 考虑到有些时候收发的顺序不同)
		if(id >= seq_id || id == 0)		// id == 0 rewind
		{
			seq_id = id;
			received = true;
		}
	}
	bool Request::ready()
	{
		static uint cnt = 0;
		if(!received)
		{
			if((++cnt) % 20 == 0)	// 等待 30 个周期还没有收到response,则重发
			{
				++seq_id;
				return true;
			}
		}
		else
		{
			cnt = 1;
		}
		return received;
	}
	void Request::next()
	{
		if(received)
		{
			this->operator ++();
			++seq_id;
		}
	}
	Request& Request::operator++()
	{
		return *this;
	}
	void Request::send(TcpSocket& soc)
	{
		ReqHead* pHead = (ReqHead*)buff();
		pHead->set_seq_id(seq_id);
		soc.SendBuf(buff(), len());
		received = false;
	}
	Request::~Request(){}

	ReqHead::ReqHead( ushort 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;
	}
	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;
	}

	char* StockHeartBeat::buff()
	{
		return (char*)&s;
	}
	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;
		}
	}
	char* StockListReq::buff()
	{
		return (char*)&s;
	}
	ulong StockListReq::len()
	{
		return sizeof(StockListStruct);
	}
	
	StockListReq::operator bool ()
	{
		return s.offset < total;
	}
	StockListReq& StockListReq::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;
	}

	char* StockHoldChgReq::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);
	}

}


⌨️ 快捷键说明

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