Connection.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:6k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // Connection.cpp: implementation of the CConnection class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "Connection.h"
  7. #include "Encrypter.h"
  8. #include "Upload.h"
  9. #include "SingleDownload.h"
  10. #include "Connector.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. char* tobinary(long lnum, char* pBuf, long length=4);
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. CConnection::CConnection(CEncryptedConnection* pEConnection, CConnector* pConnector)
  21. {
  22. m_pEConnection = pEConnection;
  23. m_pConnector = pConnector;
  24. m_bGotAnything = false;
  25. m_pUpload = 0;
  26. m_pDownload = 0;
  27. m_bPause = false;
  28. m_lIndex = 0;
  29. memset(m_lValueUp, 0, eCount*sizeof(long));
  30. memset(m_lValueDown, 0, eCount*sizeof(long));
  31. }
  32. CConnection::~CConnection()
  33. {
  34. }
  35. void CConnection::GetRate(long& lDownRate, long & lUpRate) 
  36. {
  37. lDownRate = m_pDownload->get_rate();
  38. lUpRate = m_pUpload->get_rate();
  39. if (--m_lIndex < 0)
  40. {
  41. m_lIndex = eCount - 1;
  42. }
  43. m_lValueUp[m_lIndex] = lUpRate/1024;
  44. m_lValueDown[m_lIndex] = lDownRate/1024;
  45. }
  46. string CConnection::GetIP()
  47. {
  48. return m_pEConnection->GetIP();
  49. }
  50. bool CConnection::GetIP(long& lAddr, short& sPort)
  51. {
  52. return m_pEConnection->GetIP(lAddr, sPort);
  53. }
  54. memstream& CConnection::GetID()
  55. {
  56. return m_pEConnection->GetID();
  57. }
  58. void CConnection::Close()
  59. {
  60. m_pEConnection->Close();
  61. }
  62. bool CConnection::IsFlush()
  63. {
  64. if (m_pConnector->IsRatecap() || IsPause())
  65. return false;
  66. return m_pEConnection->IsFlush();
  67. }
  68. bool CConnection::is_locally_initiated()
  69. {
  70. return m_pEConnection->is_locally_initiated();
  71. }
  72. void CConnection::send_interested()
  73. {
  74. char c = INTERESTED;
  75. m_pEConnection->send_message(&c, sizeof(char));
  76. }
  77. void CConnection::send_not_interested()
  78. {
  79. char c = NOT_INTERESTED;
  80. m_pEConnection->send_message(&c, sizeof(char));
  81. }
  82. void CConnection::send_choke()
  83. {
  84. char c = CHOKE;
  85. m_pEConnection->send_message(&c, sizeof(char));
  86. }
  87. void CConnection::send_unchoke()
  88. {
  89. char c = UNCHOKE;
  90. m_pEConnection->send_message(&c, sizeof(char));
  91. }
  92. void CConnection::send_request(long index, long begin, long length)
  93. {
  94. char lenBuf[4] = {0};
  95. char c = REQUEST;
  96. memstream memtemp;
  97. memtemp.write(&c, 1);
  98. memtemp.write(tobinary(index, lenBuf), sizeof(long));
  99. memtemp.write(tobinary(begin, lenBuf), sizeof(long));
  100. memtemp.write(tobinary(length, lenBuf), sizeof(long));
  101. // m_pConnector->got_message(m_pEConnection, memtemp, memtemp.size());
  102. m_pEConnection->send_message(memtemp, memtemp.size());
  103. }
  104. void CConnection::send_cancel(long index, long begin, long length)
  105. {
  106. char lenBuf[4] = {0};
  107. char c = CANCEL;
  108. memstream memtemp;
  109. memtemp.write(&c, 1);
  110. memtemp.write(tobinary(index, lenBuf), sizeof(long));
  111. memtemp.write(tobinary(begin, lenBuf), sizeof(long));
  112. memtemp.write(tobinary(length, lenBuf), sizeof(long));
  113. m_pEConnection->send_message(memtemp, memtemp.size());
  114. }
  115. void CConnection::send_piece(long index, long begin, memstream& piece)
  116. {
  117. assert(!m_pConnector->IsRatecap());
  118. m_pConnector->_update_upload_rate(piece.size());
  119. char lenBuf[4] = {0};
  120. char c = PIECE;
  121. memstream memtemp;
  122. memtemp.write(&c, 1);
  123. memtemp.write(tobinary(index, lenBuf), sizeof(long));
  124. memtemp.write(tobinary(begin, lenBuf), sizeof(long));
  125. memtemp.write(piece, piece.size());
  126. m_pEConnection->send_message(memtemp, memtemp.size());
  127. }
  128. void CConnection::send_bitfield(vector<bool>& vHave)
  129. {
  130. char c = BITFIELD;
  131. memstream memtemp;
  132. memtemp.write(&c, 1);
  133. memstream mret;
  134. booleans_to_bitfield(vHave, mret);
  135. memtemp.write(mret, mret.size());
  136. m_pEConnection->send_message(memtemp, memtemp.size());
  137. }
  138. void CConnection::send_have(long index)
  139. {
  140. char lenBuf[4] = {0};
  141. char c = HAVE;
  142. memstream memtemp;
  143. memtemp.write(&c, 1);
  144. memtemp.write(tobinary(index, lenBuf), sizeof(long));
  145. m_pEConnection->send_message(memtemp, memtemp.size());
  146. }
  147. bool CConnection::IsPause()
  148. {
  149. return m_bPause;
  150. }
  151. void CConnection::Pause(bool bPause)
  152. {
  153. if (IsPause() == bPause)
  154. {
  155. assert(false);
  156. return;
  157. }
  158. m_bPause = bPause;
  159. if (!bPause)
  160. {
  161. if (m_pDownload)
  162. m_pDownload->download_more();
  163. }
  164. }
  165. /*
  166. long l = 17;
  167. char a[20] = {0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
  168. memstream m, mret, memsrc;
  169. m.write(a, l);
  170. booleans_to_bitfield1(m, mret);
  171. unsigned char b[30] = {0};
  172. memcpy(b, mret, mret.size());
  173. bitfield_to_booleans(mret, l, memsrc);
  174. memcpy(b, memsrc, memsrc.size());
  175. assert(memsrc == m);
  176. //*/
  177. void booleans_to_bitfield(vector<bool>& vHave, memstream& memRet)
  178. {
  179. assert(vHave.size() > 0);
  180. unsigned char p = 0x80;
  181. unsigned char c = 0;
  182. for (int i=0; i<vHave.size(); i++)
  183. {
  184. if (vHave[i])
  185. c |= p;
  186. p >>= 1;
  187. if ((i+1)%8 == 0)
  188. {
  189. memRet.write((char*)&c, 1);
  190. p = 0x80;
  191. c = 0;
  192. }
  193. }
  194. if (i%8 != 0)
  195. memRet.write((char*)&c, 1);
  196. }
  197. bool bitfield_to_booleans(memstream& membitfield, long lNumPieces, vector<bool>& vHave)
  198. {
  199. assert(membitfield.size() > 0 && lNumPieces > 0);
  200. long lextra = membitfield.size()* 8 - lNumPieces;
  201. if (lextra >= 8 || lextra < 0)
  202. {
  203. assert(false);
  204. return false;
  205. }
  206. for (int i=0; i<membitfield.size(); i++)
  207. {
  208. unsigned char c = membitfield[i];
  209. unsigned char p = 0x80;
  210. for (int j=0; j<8; j++)
  211. {
  212. // unsigned char ctrue = (c & p) ? 1 : 0;
  213. // memRet.write((char*)&ctrue, sizeof(char));
  214. vHave.push_back(c & p ? true : false);
  215. p >>= 1;
  216. if (--lNumPieces <= 0)
  217. break;
  218. }
  219. }
  220. return true;
  221. }