request.cpp
上传用户:egreat
上传日期:2007-07-13
资源大小:29k
文件大小:3k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #include "config.h"
  2. #include <vector>
  3. #include <set>
  4. #include <map>
  5. #include <queue>
  6. #include <boost/thread/detail/config.hpp>
  7. #include <boost/thread/thread.hpp>
  8. #include <boost/thread/recursive_mutex.hpp>
  9. #include <boost/smart_ptr.hpp>
  10. #include <boost/date_time/gregorian/gregorian.hpp>
  11. #include "tcpSocket.h"
  12. #include "stock.h"
  13. #include "request.h"
  14. namespace StockMarket
  15. {
  16. recursive_mutex req_queue_mutex;
  17. uint Request::seq_id = 1;
  18. bool Request::received = true;
  19. Request::Request() : first(true)
  20. {}
  21. Request::operator bool ()
  22. {
  23. if(first) 
  24. {
  25. first = false;
  26. return true;
  27. }
  28. else
  29. {
  30. return false;
  31. }
  32. }
  33. void Request::res_seq_id(uint id)
  34. {
  35. // 只有收到较后面的时候,才设置新值
  36. // ( 考虑到有些时候收发的顺序不同)
  37. if(id >= seq_id || id == 0) // id == 0 rewind
  38. {
  39. seq_id = id;
  40. received = true;
  41. }
  42. }
  43. bool Request::ready()
  44. {
  45. static uint cnt = 0;
  46. if(!received)
  47. {
  48. if((++cnt) % 20 == 0) // 等待 30 个周期还没有收到response,则重发
  49. {
  50. ++seq_id;
  51. return true;
  52. }
  53. }
  54. else
  55. {
  56. cnt = 1;
  57. }
  58. return received;
  59. }
  60. void Request::next()
  61. {
  62. if(received)
  63. {
  64. this->operator ++();
  65. ++seq_id;
  66. }
  67. }
  68. Request& Request::operator++()
  69. {
  70. return *this;
  71. }
  72. void Request::send(TcpSocket& soc)
  73. {
  74. ReqHead* pHead = (ReqHead*)buff();
  75. pHead->set_seq_id(seq_id);
  76. soc.SendBuf(buff(), len());
  77. received = false;
  78. }
  79. Request::~Request(){}
  80. ReqHead::ReqHead( ushort cmd_id, ushort packet_len/*the total packet len*/ = 0)
  81. {
  82. zip = 0x0c;
  83. seq_id = 0;
  84. packet_type = 1;
  85. len = len1 = packet_len - sizeof(ReqHead) + 2;
  86. cmd = cmd_id;
  87. }
  88. uint ReqHead::get_seq_id()
  89. {
  90. return seq_id;
  91. }
  92. void ReqHead::set_seq_id(uint id)
  93. {
  94. seq_id = id;
  95. }
  96. void ReqHead::set_len(ushort payload_len)
  97. {
  98. len = len1 = payload_len;
  99. }
  100. ushort ReqHead::get_len()
  101. {
  102. return len;
  103. }
  104. char* StockHeartBeat::buff()
  105. {
  106. return (char*)&s;
  107. }
  108. ulong StockHeartBeat::len()
  109. {
  110. return sizeof(StockHeartBeatStruct);
  111. }
  112. StockListReq::StockListReq(MarketInfo::MarketType market_code, ushort record_offset
  113. , ushort record_count, ushort record_total)
  114. : s(market_code, record_offset, record_count), total(record_total)
  115. {
  116. if(0 == record_total)
  117. {
  118. total = record_count;
  119. }
  120. }
  121. char* StockListReq::buff()
  122. {
  123. return (char*)&s;
  124. }
  125. ulong StockListReq::len()
  126. {
  127. return sizeof(StockListStruct);
  128. }
  129. StockListReq::operator bool ()
  130. {
  131. return s.offset < total;
  132. }
  133. StockListReq& StockListReq::operator ++ ()
  134. {
  135. if(s.offset + s.count < total)
  136. {
  137. s.offset = s.offset + s.count ;
  138. s.count = (total - s.offset) > s.count ? s.count : (total - s.offset);
  139. }
  140. else
  141. {
  142. s.offset = total;
  143. }
  144. return *this;
  145. }
  146. char* StockHoldChgReq::buff()
  147. {
  148. return (char*)&s;
  149. }
  150. ulong StockHoldChgReq::len()
  151. {
  152. return sizeof(ReqHead) + sizeof(ushort) + sizeof(StockHoldStruct) * s.count;
  153. }
  154. bool StockHoldChgReq::add_stock(const string& stock_code)
  155. {
  156. return s.add_one_stock(stock_code);
  157. }
  158. }