AsyncConnection.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include "Connection.h"
  2. namespace crown
  3. {
  4. namespace network
  5. {
  6. Connection::Connection(Allocator& allocator) :
  7. m_reliable_send(allocator),
  8. m_reliable_receive(allocator)
  9. {
  10. }
  11. //-----------------------------------------------------------------------------
  12. Connection::~Connection()
  13. {
  14. }
  15. //-----------------------------------------------------------------------------
  16. void Connection::init(const os::NetAddress addr, const int id)
  17. {
  18. m_remote_address = addr;
  19. m_id = id;
  20. m_max_rate = 64000;
  21. m_last_send_time = 0;
  22. m_last_data_bytes = 0;
  23. m_outgoing_rate_time = 0;
  24. m_outgoing_rate_bytes = 0;
  25. m_incoming_rate_time = 0;
  26. m_incoming_rate_bytes = 0;
  27. m_incoming_recv_packets = 0.0f;
  28. m_incoming_dropped_packets = 0.0f;
  29. m_incoming_packet_loss_time = 0;
  30. m_outgoing_sequence = 0;
  31. m_incoming_sequence = 0;
  32. }
  33. //-----------------------------------------------------------------------------
  34. void Connection::reset_rate()
  35. {
  36. m_last_send_time = 0;
  37. m_last_data_bytes = 0;
  38. m_outgoing_rate_time = 0;
  39. m_outgoing_rate_bytes = 0;
  40. m_incoming_rate_time = 0;
  41. m_incoming_rate_bytes = 0;
  42. }
  43. //-----------------------------------------------------------------------------
  44. void Connection::set_max_outgoing_rate(int rate)
  45. {
  46. m_max_rate = rate;
  47. }
  48. //-----------------------------------------------------------------------------
  49. int Connection::get_max_outgoing_rate()
  50. {
  51. return m_max_rate;
  52. }
  53. //-----------------------------------------------------------------------------
  54. os::NetAddress Connection::get_remote_address() const
  55. {
  56. return m_remote_address;
  57. }
  58. //-----------------------------------------------------------------------------
  59. int Connection::get_outgoing_rate() const
  60. {
  61. return m_outgoing_rate_bytes;
  62. }
  63. //-----------------------------------------------------------------------------
  64. int Connection::get_incoming_rate() const
  65. {
  66. return m_incoming_rate_bytes;
  67. }
  68. //-----------------------------------------------------------------------------
  69. float Connection::get_incoming_packet_loss() const
  70. {
  71. if (m_incoming_recv_packets == 0 && m_incoming_dropped_packets == 0)
  72. {
  73. return 0.0f;
  74. }
  75. // return loss packet %
  76. return m_incoming_dropped_packets * 100 / (m_incoming_recv_packets + m_incoming_dropped_packets);
  77. }
  78. //-----------------------------------------------------------------------------
  79. bool Connection::ready_to_send(const int time) const
  80. {
  81. // if max rate isn't set, send message
  82. if (!m_max_rate)
  83. {
  84. return true;
  85. }
  86. int delta_time;
  87. delta_time = time - m_last_send_time;
  88. if (delta_time > 1000)
  89. {
  90. return true;
  91. }
  92. // if last message wasn't sent, sent it!
  93. return ((m_last_data_bytes - ((delta_time * m_max_rate) / 1000)) <= 0);
  94. }
  95. //-----------------------------------------------------------------------------
  96. /*
  97. Processes the incoming message. Returns true when a complete message
  98. is ready for further processing. In that case the read pointer of msg
  99. points to the first byte ready for reading, and sequence is set to
  100. the sequence number of the message.
  101. */
  102. bool Connection::process(const os::NetAddress from, int time, BitMessage &msg, int &sequence)
  103. {
  104. }
  105. //-----------------------------------------------------------------------------
  106. void Connection::send_reliable_message(const BitMessage& msg)
  107. {
  108. uint32_t id = msg.read_int32();
  109. msg.begin_reading();
  110. if (id == m_id)
  111. {
  112. m_reliable_send.push_back(msg);
  113. }
  114. }
  115. //-----------------------------------------------------------------------------
  116. bool Connection::receive_reliable_message(BitMessage& msg)
  117. {
  118. uint32_t id = msg.read_int32();
  119. // check correctness of message id
  120. if (id == m_id)
  121. {
  122. // save message
  123. m_reliable_receive.push_back(msg);
  124. return true;
  125. }
  126. return false;
  127. }
  128. //-----------------------------------------------------------------------------
  129. void Connection::clear_reliable_messages()
  130. {
  131. m_reliable_send.clear();
  132. m_reliable_receive.clear();
  133. }
  134. //-----------------------------------------------------------------------------
  135. void Connection::_update_outgoing_rate(const int time, const int size)
  136. {
  137. // update the outgoing rate control variables
  138. int delta_time;
  139. delta_time = time - m_last_send_time;
  140. if (delta_time > 1000)
  141. {
  142. m_last_data_bytes = 0;
  143. }
  144. else
  145. {
  146. m_last_data_bytes -= (delta_time * m_max_rate) / 1000;
  147. if ( m_last_data_bytes < 0 )
  148. {
  149. m_last_data_bytes = 0;
  150. }
  151. }
  152. m_last_data_bytes += size;
  153. m_last_send_time = time;
  154. // update outgoing rate variables
  155. if (time - m_outgoing_rate_time > 1000)
  156. {
  157. m_outgoing_rate_bytes -= m_outgoing_rate_bytes * (time - m_outgoing_rate_time - 1000) / 1000;
  158. if (m_outgoing_rate_bytes < 0)
  159. {
  160. m_outgoing_rate_bytes = 0;
  161. }
  162. }
  163. m_outgoing_rate_time = time - 1000;
  164. m_outgoing_rate_bytes += size;
  165. }
  166. //-----------------------------------------------------------------------------
  167. void Connection::_update_incoming_rate(const int time, const int size)
  168. {
  169. // update incoming rate variables
  170. if (time - m_incoming_rate_time > 1000)
  171. {
  172. m_incoming_rate_bytes -= m_incoming_rate_bytes * (time - m_incoming_rate_time - 1000) / 1000;
  173. if (m_incoming_rate_bytes < 0)
  174. {
  175. m_incoming_rate_bytes = 0;
  176. }
  177. }
  178. m_incoming_rate_time = time - 1000;
  179. m_incoming_rate_bytes += size;
  180. }
  181. //-----------------------------------------------------------------------------
  182. void Connection::_update_packet_loss(const int time, const int num_recv, const int num_dropped)
  183. {
  184. // update incoming packet loss variables
  185. if (time - m_incoming_packet_loss_time > 5000)
  186. {
  187. float scale = (time - m_incoming_packet_loss_time - 5000) * (1.0f / 5000.0f);
  188. m_incoming_recv_packets -= m_incoming_recv_packets * scale;
  189. if (m_incoming_recv_packets < 0.0f)
  190. {
  191. m_incoming_recv_packets = 0.0f;
  192. }
  193. m_incoming_dropped_packets -= m_incoming_dropped_packets * scale;
  194. if (m_incoming_dropped_packets < 0.0f)
  195. {
  196. m_incoming_dropped_packets = 0.0f;
  197. }
  198. }
  199. m_incoming_packet_loss_time = time - 5000;
  200. m_incoming_recv_packets += num_recv;
  201. m_incoming_dropped_packets += num_dropped;
  202. }
  203. } // namespace network
  204. } // namespace crown