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

P2P编程

开发平台:

Visual C++

  1. // SingleDownload.cpp: implementation of the CSingleDownload class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "SingleDownload.h"
  7. #include "Downloader.h"
  8. #include "PiecePicker.h"
  9. #include "StorageWrapper.h"
  10. #include "Connection.h"
  11. #include "RateMeasure.h"
  12. #include "DownloaderFeedback.h"
  13. #ifdef _DEBUG
  14. #undef THIS_FILE
  15. static char THIS_FILE[]=__FILE__;
  16. #define new DEBUG_NEW
  17. #endif
  18. bool bitfield_to_booleans(memstream& membitfield, long l, memstream& memRet);
  19.  
  20. //////////////////////////////////////////////////////////////////////
  21. // Construction/Destruction
  22. //////////////////////////////////////////////////////////////////////
  23. CSingleDownload::CSingleDownload(CDownloaderFeedback* pDownloaderFeedback, CDownloader* pDownloader, CConnection* pConnection)
  24. :m_measure(pDownloader->m_lMaxRatePeriod)
  25. {
  26. m_pDownloader = pDownloader;
  27. m_pConnection = pConnection;
  28. m_bChoked = true;
  29. m_bInterested = false;
  30. m_tLast = 0;
  31. for (int i=0; i<pDownloader->m_lNumPieces; i++)
  32. m_vHave.push_back(false);
  33. // for endgame.
  34. m_bEndgame = false;
  35. m_lHave = 0;
  36. // for feedback
  37. m_pDownloaderFeedback = pDownloaderFeedback;
  38. m_pConnection->GetIP(m_lAddr, m_sPort);
  39. }
  40. CSingleDownload::~CSingleDownload()
  41. {
  42. }
  43. void CSingleDownload::disconnected()
  44. {
  45. if (m_bEndgame)
  46. {
  47. // disconnected_end();
  48. // return ;
  49. }
  50. vector<CSingleDownload*>::iterator it = 
  51. find(m_pDownloader->m_vDownloads.begin(), m_pDownloader->m_vDownloads.end(), this);
  52. assert(it != m_pDownloader->m_vDownloads.end());
  53. m_pDownloader->m_vDownloads.erase(it);
  54. for (int i=0; i<m_vHave.size(); i++)
  55. {
  56. if (m_vHave[i])
  57. m_pDownloader->m_pPicker->lost_have(i);
  58. }
  59. if (m_bEndgame) return;
  60. _letgo();
  61. }
  62. void CSingleDownload::_letgo()
  63. {
  64. vector<long> vHit;
  65. for (int i=0; i<m_vActiveRequests.size(); i++)
  66. {
  67. CRequestsItem& item = m_vActiveRequests[i];
  68. bool bBefore = m_pDownloader->m_pstrorage->do_I_have_requests(item.m_index);
  69. m_pDownloader->m_pstrorage->request_lost(item.m_index, item.m_begin, item.m_length);
  70. if (!bBefore)
  71. vHit.push_back(item.m_index);
  72. }
  73. m_vActiveRequests.erase(m_vActiveRequests.begin(), m_vActiveRequests.end());
  74. if (vHit.size() > 0)
  75. {
  76. for (i=0; i<m_pDownloader->m_vDownloads.size(); i++)
  77. {
  78. m_pDownloader->m_vDownloads[i]->_check_interest(vHit);
  79. m_pDownloader->m_vDownloads[i]->download_more(vHit);
  80. }
  81. }
  82. }
  83. void CSingleDownload::got_choke()
  84. {
  85. if (m_bEndgame)
  86. {
  87. got_choke_end();
  88. return ;
  89. }
  90. // ShowMessage(m_pConnection->m_pEConnection, "got_choke()");
  91. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "got_choke()");
  92. if (!m_bChoked)
  93. {
  94. m_bChoked = true;
  95. _letgo();
  96. }
  97. }
  98. void CSingleDownload::got_unchoke()
  99. {
  100. if (m_bEndgame)
  101. {
  102. got_unchoke_end();
  103. return ;
  104. }
  105. // ShowMessage(m_pConnection->m_pEConnection, "got_unchoke()");
  106. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "got_unchoke()");
  107. if (m_bChoked)
  108. {
  109. m_bChoked = false;
  110. download_more();
  111. }
  112. }
  113. void CSingleDownload::got_have(long index)
  114. {
  115. if (m_bEndgame)
  116. {
  117. got_have_end(index);
  118. return;
  119. }
  120. if (m_vHave[index])
  121. return;
  122. m_lHave ++;
  123. assert(m_lHave <= m_vHave.size());
  124. m_vHave[index] = true;
  125. m_pDownloader->m_pPicker->got_have(index);
  126. m_vNewHave.push_back(index);
  127. vector<long> vHit;
  128. vHit.push_back(index);
  129. _check_interest(vHit);
  130. download_more(vHit);
  131. char szText[100] = {0};
  132. sprintf(szText, "got_have() : index = %d, ", index);
  133. // ShowMessage(m_pConnection->m_pEConnection, szText);
  134. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  135. }
  136. void CSingleDownload::got_have_bitfield(vector<bool>& vHave)
  137. {
  138. if (m_bEndgame)
  139. {
  140. got_have_bitfield_end(vHave);
  141. return;
  142. }
  143. assert(vHave.size() == m_pDownloader->m_lNumPieces);
  144. for (int i=0; i<vHave.size(); i++)
  145. m_vHave[i] = vHave[i];
  146. vector<long> vHit;
  147. for (i=0; i<m_vHave.size(); i++)
  148. {
  149. if (m_vHave[i])
  150. {
  151. m_pDownloader->m_pPicker->got_have(i);
  152. m_vNewHave.push_back(i);
  153. vHit.push_back(i);
  154. m_lHave++;
  155. assert(m_lHave <= m_vHave.size());
  156. }
  157. }
  158. _check_interest(vHit);
  159. download_more();
  160. // ShowMessage(m_pConnection->m_pEConnection, "got_have_bitfield()");
  161. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "got_have_bitfield()");
  162. }
  163. void CSingleDownload::_check_interest(vector<long>& vHit)
  164. {
  165. if (m_bInterested)
  166. return ;
  167. for (int i=0; i<vHit.size(); i++)
  168. {
  169. long index = vHit[i];
  170. if (m_vHave[index] && m_pDownloader->m_pstrorage->do_I_have_requests(index))
  171. {
  172. m_pConnection->send_interested();
  173. m_bInterested = true;
  174. break;
  175. }
  176. }
  177. }
  178. void CSingleDownload::_lost_interest(vector<long>& vHit)
  179. {
  180. if ( (!m_bInterested) || m_vActiveRequests.size() > 0)
  181. return;
  182. for (int i=0; i<vHit.size(); i++)
  183. {
  184. long index = vHit[i];
  185. if (m_vHave[index])
  186. break;
  187. }
  188. // can't find
  189. if (i == vHit.size())
  190. return;
  191. for (i=0; i<m_vHave.size(); i++)
  192. if (m_vHave[i] && m_pDownloader->m_pstrorage->do_I_have_requests(i))
  193. return;
  194. m_bInterested = false;
  195. m_pConnection->send_not_interested();
  196. }
  197. void CSingleDownload::download_more( vector<long>& vPieces)
  198. {
  199. assert(!m_bEndgame);
  200. if (m_bChoked || (m_vActiveRequests.size() >= m_pDownloader->m_lBacklog) || 
  201. m_pConnection->IsPause())
  202. return;
  203. if (vPieces.size() <= 0)
  204. vPieces = m_pDownloader->m_pPicker->GetResult();
  205. vector<long> vHit;
  206. _d(vPieces, vHit);
  207. if (vHit.size() > 0)
  208. {
  209. for (int i=0; i<m_pDownloader->m_vDownloads.size(); i++)
  210. {
  211. m_pDownloader->m_vDownloads[i]->_lost_interest(vHit);
  212. }
  213. }
  214. }
  215. void CSingleDownload::_d(vector<long>&vPieces, vector<long>& vHit)
  216. {
  217. for (int i=0; i<vPieces.size(); i++)
  218. {
  219. long index = vPieces[i];
  220. if (m_vHave[index])
  221. {
  222. while(m_pDownloader->m_pstrorage->do_I_have_requests(index))
  223. {
  224. long begin = 0, length = 0;
  225. m_pDownloader->m_pstrorage->new_request(index, begin, length);
  226. m_vActiveRequests.push_back(CRequestsItem(index, begin, length));
  227. m_pConnection->send_request(index, begin, length);
  228. char szText[100] = {0};
  229. sprintf(szText, "send request () index = %d, begin = %d, length = %d", index, begin, length);
  230. // ShowMessage(m_pConnection->m_pEConnection, szText);
  231. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  232. if (!m_pDownloader->m_pstrorage->do_I_have_requests(index))
  233. vHit.push_back(index);
  234. if (m_vActiveRequests.size() >= m_pDownloader->m_lBacklog)
  235. return;
  236. }
  237. }
  238. }
  239. }
  240. bool CSingleDownload::got_piece(long index, long begin, memstream& memPiece)
  241. {
  242. if (m_bEndgame)
  243. {
  244. return got_piece_end(index, begin, memPiece);
  245. }
  246. char szText[100] = {0};
  247. sprintf(szText, "got_piece() : index = %d, begin = %d, length = %d", index, begin, memPiece.size());
  248. // ShowMessage(m_pConnection->m_pEConnection, szText);
  249. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  250. bool bfind = false;
  251. for (int i=0; i<m_vActiveRequests.size(); i++)
  252. {
  253. CRequestsItem& item = m_vActiveRequests[i];
  254. if (item.m_index == index && item.m_begin == begin && item.m_length == memPiece.size())
  255. {
  256. m_vActiveRequests.erase(m_vActiveRequests.begin() + i);
  257. bfind = true;
  258. break;
  259. }
  260. }
  261. if (!bfind)
  262. {
  263. // assert(bfind);
  264. return false;
  265. }
  266. time(&m_tLast);
  267. m_measure.update_rate(memPiece.size());
  268. m_pDownloader->m_pDownMeasure->update_rate(memPiece.size());
  269. m_pDownloader->m_pPicker->came_in(index);
  270. m_pDownloader->m_pstrorage->piece_came_in(index, memPiece, begin, memPiece.size());
  271. m_pDownloader->m_pRateMeasure->data_came_in(memPiece.size());
  272. if (m_pDownloader->m_pstrorage->do_I_have(index))
  273. {
  274. sprintf(szText, "complete : index = %d", index);
  275. // ShowMessage(m_pConnection->m_pEConnection, szText);
  276. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  277. m_pDownloader->m_pPicker->complete(index);
  278. }
  279. download_more();
  280. if (m_vActiveRequests.size() <= 0)
  281. {
  282. m_bInterested = false;
  283. m_pConnection->send_not_interested();
  284. }
  285. return m_pDownloader->m_pstrorage->do_I_have(index);
  286. }
  287. long CSingleDownload::get_rate()
  288. {
  289. return m_measure.get_rate();
  290. }
  291. long CSingleDownload::get_total()
  292. {
  293. return m_measure.get_total();
  294. }
  295. bool CSingleDownload::is_snubbed()
  296. {
  297. time_t t;
  298. time(&t);
  299. if (t < m_tLast)
  300. {
  301. assert(false);
  302. m_tLast = t;
  303. }
  304. return ((t - m_tLast) > m_pDownloader->m_lSnubTime);
  305. }
  306. bool CSingleDownload::is_choked()
  307. {
  308. return m_bChoked;
  309. }
  310. bool CSingleDownload::is_interested()
  311. {
  312. return m_bInterested;
  313. }
  314. float CSingleDownload::GetHaveCountPercent()
  315. {
  316. if (m_vHave.size() <= 0)
  317. {
  318. assert(false);
  319. return 0;
  320. }
  321. float lPer = (float)m_lHave/m_vHave.size();
  322. return lPer;
  323. }
  324. long CSingleDownload:: get_have_count() const
  325. {
  326. return m_vHave.size();
  327. }
  328. void CSingleDownload:: get_have(vector<bool>& vHave) 
  329. {
  330. vHave = m_vHave;
  331. m_vNewHave.clear();
  332. }
  333. void CSingleDownload:: get_new_have(vector<bool>& vHave) 
  334. {
  335. for (int i=0; i<m_vNewHave.size();i++)
  336. {
  337. assert(m_vNewHave[i] < vHave.size());
  338. vHave[m_vNewHave[i]] = true;
  339. }
  340. m_vNewHave.clear();
  341. }
  342. //////////////////////////////////////////////////////////////////////////
  343. // for end game.
  344. void CSingleDownload::cancel_endgame()
  345. {
  346. assert(m_bEndgame);
  347. m_bEndgame = false;
  348. m_vActiveRequests.clear();
  349. }
  350. void CSingleDownload::make_endgame(vector<CRequestsItem>& vRequests)
  351. {
  352. assert(!m_bEndgame);
  353. m_bEndgame = true;
  354. for (int i=0; i<m_vActiveRequests.size(); i++)
  355. vRequests.push_back(m_vActiveRequests[i]);
  356. m_lHave = 0;
  357. for (i=0; i<m_vHave.size(); i++)
  358. if (m_vHave[i])
  359. m_lHave++;
  360. // ShowMessage(m_pConnection->m_pEConnection, "***************rnmake_endgame()");
  361. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "***************rnmake_endgame()");
  362. }
  363. void CSingleDownload::mak_endgameflush()
  364. {
  365. if (m_bChoked)
  366. return;
  367. random_shuffle(m_pDownloader->m_vRequests.begin(), m_pDownloader->m_vRequests.end());
  368. for (int i=0; i<m_pDownloader->m_vRequests.size(); i++)
  369. {
  370. CRequestsItem& item = m_pDownloader->m_vRequests[i];
  371. bool bfind = false;
  372. for (int j=0; j<m_vActiveRequests.size(); j++)
  373. {
  374. /*if(item.m_index == m_vActiveRequests[j].m_index && 
  375. item.m_begin == m_vActiveRequests[j].m_begin && 
  376. item.m_length== m_vActiveRequests[j].m_length)
  377. //*/
  378. if (item == m_vActiveRequests[j])
  379. {
  380. bfind = true;
  381. break;
  382. }
  383. }
  384. if (bfind) continue;
  385. if (m_vHave[item.m_index])
  386. {
  387. send_request_end(item.m_index, item.m_begin, item.m_length);
  388. }
  389. }
  390. }
  391. void CSingleDownload::disconnected_end()
  392. {
  393. vector<CSingleDownload*>::iterator it = 
  394. find(m_pDownloader->m_vDownloads.begin(), m_pDownloader->m_vDownloads.end(), this);
  395. assert(it != m_pDownloader->m_vDownloads.end());
  396. m_pDownloader->m_vDownloads.erase(it);
  397. }
  398. void CSingleDownload::got_unchoke_end()
  399. {
  400. // ShowMessage(m_pConnection->m_pEConnection, "got_unchoke_end()");
  401. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "got_unchoke_end()");
  402. if (!m_bChoked) return;
  403. m_bChoked = false;
  404. if (!m_bInterested) return;
  405. random_shuffle(m_pDownloader->m_vRequests.begin(), m_pDownloader->m_vRequests.end());
  406. for (int i=0; i<m_pDownloader->m_vRequests.size(); i++)
  407. {
  408. CRequestsItem& item = m_pDownloader->m_vRequests[i];
  409. if (m_vHave[item.m_index])
  410. {
  411. send_request_end(item.m_index, item.m_begin, item.m_length);
  412. }
  413. }
  414. }
  415. void CSingleDownload::got_choke_end()
  416. {
  417. // ShowMessage(m_pConnection->m_pEConnection, "got_choke_end()");
  418. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "got_choke_end()");
  419. m_bChoked = true;
  420. }
  421. void CSingleDownload::send_request_end(long index, long begin, long length)
  422. {
  423. char szText[100] = {0};
  424. sprintf(szText, "send_request_end() : index = %d, begin = %d, length = %d", index, begin, length);
  425. // ShowMessage(m_pConnection->m_pEConnection, szText);
  426. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  427. if (!m_bInterested)
  428. {
  429. m_bInterested = true;
  430. m_pConnection->send_interested();
  431. }
  432. m_pConnection->send_request(index, begin, length);
  433. }
  434. bool CSingleDownload::got_piece_end(long index,long begin, memstream& memPiece)
  435. {
  436. char szText[100] = {0};
  437. sprintf(szText, "got_piece_end() : index = %d, begin = %d, length = %d", index, begin, memPiece.size());
  438. // ShowMessage(m_pConnection->m_pEConnection, szText);
  439. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  440. bool bfind = false;
  441. for (int i=0; i<m_pDownloader->m_vRequests.size(); i++)
  442. {
  443. CRequestsItem& item = m_pDownloader->m_vRequests[i];
  444. if (item.m_index == index && item.m_begin == begin && item.m_length == memPiece.size())
  445. {
  446. m_pDownloader->m_vRequests.erase(m_pDownloader->m_vRequests.begin() + i);
  447. bfind = true;
  448. break;
  449. }
  450. }
  451. if (!bfind)
  452. return false;
  453. //*(memPiece + 1) = 30; // test crash the piece to test data_flunk()
  454. time(&m_tLast);
  455. m_measure.update_rate(memPiece.size());
  456. m_pDownloader->m_pDownMeasure->update_rate(memPiece.size());
  457. m_pDownloader->m_pPicker->came_in(index);
  458. m_pDownloader->m_pstrorage->piece_came_in(index, memPiece, begin, memPiece.size());
  459. m_pDownloader->m_pRateMeasure->data_came_in(memPiece.size());
  460. // piece fail. rerequest.
  461. if (m_pDownloader->m_pstrorage->do_I_have_requests(index))
  462. {
  463. vector<CRequestsItem> vRequests;
  464. while (m_pDownloader->m_pstrorage->do_I_have_requests(index))
  465. {
  466. long begina = 0, lengtha = 0;
  467. m_pDownloader->m_pstrorage->new_request(index, begina, lengtha);
  468. vRequests.push_back(CRequestsItem(index, begina, lengtha));
  469. m_pDownloader->m_vRequests.push_back(CRequestsItem(index, begina, lengtha));
  470. }
  471. for (int i=0; i<m_pDownloader->m_vDownloads.size(); i++)
  472. {
  473. CSingleDownload* pd = m_pDownloader->m_vDownloads[i];
  474. if (!pd->is_choked() && pd->m_vHave[index])
  475. {
  476. random_shuffle(vRequests.begin(), vRequests.end());
  477. for (int j=0; j<vRequests.size(); j++)
  478. {
  479. // if(pd == this || vRequests[j].m_begin != begin)
  480. pd->send_request_end(vRequests[j].m_index, vRequests[j].m_begin, vRequests[j].m_length); 
  481. }
  482. }
  483. }
  484. return false;
  485. }
  486. // got the fraction of piece. cancel the fraction from other peers.
  487. for (i=0; i<m_pDownloader->m_vDownloads.size(); i++)
  488. {
  489. CSingleDownload* pd = m_pDownloader->m_vDownloads[i];
  490. pd->SendCancel(index, begin, memPiece.size(), this);
  491. /*
  492. if (!pd->is_choked() && pd->m_vHave[index] && pd != this)
  493. pd->m_pConnection->send_cancel(index, begin, memPiece.size());
  494. //*/
  495. }
  496. // if there are other fractions in requestment, don't send have message.
  497. for(i=0; i<m_pDownloader->m_vRequests.size(); i++)
  498. {
  499. if (m_pDownloader->m_vRequests[i].m_index == index)
  500. return false;
  501. }
  502. // **
  503. // have completed all the fractions of the piece.
  504. m_pDownloader->m_pPicker->complete(index);
  505. sprintf(szText, "complete endgame: index = %d", index);
  506. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  507. // check all the downloads which is waiting for the piece that 
  508. // after the piece was completed, is there still active waiting.
  509. // if yes break, otherwise make it notinterested.
  510. for (i=0; i<m_pDownloader->m_vDownloads.size(); i++)
  511. {
  512. CSingleDownload* pd = m_pDownloader->m_vDownloads[i];
  513. if (pd->m_vHave[index])
  514. {
  515. bool bStillActive = false;
  516. for (int j=0; j<m_pDownloader->m_vRequests.size(); j++)
  517. {
  518. long lindexa = m_pDownloader->m_vRequests[j].m_index;
  519. if (pd->m_vHave[lindexa])
  520. {
  521. bStillActive = true;
  522. break;
  523. }
  524. }
  525. if (!bStillActive)
  526. {
  527. pd->m_bInterested = false;
  528. pd->m_pConnection->send_not_interested();
  529. }
  530. }
  531. }
  532. // check all the downloads, if the the peer of one download completed download then close the connection.
  533. if (m_pDownloader->m_vRequests.size() <= 0)
  534. {
  535. vector<CSingleDownload*> vcopy = m_pDownloader->m_vDownloads;
  536. for (i=0; i<vcopy.size(); i++)
  537. {
  538. if (vcopy[i]->m_lHave >= vcopy[i]->m_vHave.size())
  539. vcopy[i]->m_pConnection->Close();
  540. }
  541. }
  542. return true;
  543. }
  544. void CSingleDownload::got_have_end(long index)
  545. {
  546. assert(index >=0 && index <= m_vHave.size());
  547. if (m_vHave[index])
  548. return;
  549. m_vHave[index] = true;
  550. m_lHave++;
  551. assert(m_lHave <= m_vHave.size());
  552. m_pDownloader->m_pPicker->got_have(index);
  553. m_vNewHave.push_back(index);
  554. if (m_pDownloader->m_pstrorage->do_I_have(index))
  555. return;
  556. // todo:should shuffle here.
  557. random_shuffle(m_pDownloader->m_vRequests.begin(), m_pDownloader->m_vRequests.end());
  558. // if the have index is in requrements, then request all the fractions of the have piece.
  559. for (int i=0; i<m_pDownloader->m_vRequests.size(); i++)
  560. {
  561. CRequestsItem& item = m_pDownloader->m_vRequests[i];
  562. if (item.m_index == index)
  563. send_request_end(item.m_index, item.m_begin, item.m_length);
  564. }
  565. // if download completed, and peer also have all the pieces, then close the connection.
  566. if (m_pDownloader->m_vRequests.size() <= 0 && m_lHave >= m_vHave.size())
  567. {
  568. m_pConnection->Close();
  569. return;
  570. }
  571. char szText[100] = {0};
  572. sprintf(szText, "got_have_end() : index = %d, ", index);
  573. //  ShowMessage(m_pConnection->m_pEConnection, szText);
  574. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, szText);
  575. }
  576. void CSingleDownload::got_have_bitfield_end(vector<bool>& vHave)
  577. {
  578. assert(vHave.size() == m_pDownloader->m_lNumPieces);
  579. m_lHave = 0;
  580. for (int i=0; i<vHave.size(); i++)
  581. {
  582. m_vHave[i] = vHave[i];
  583. if (m_vHave[i])
  584. {
  585. m_lHave ++;
  586. assert(m_lHave <= m_vHave.size());
  587. m_pDownloader->m_pPicker->got_have(i);
  588. m_vNewHave.push_back(i);
  589. }
  590. }
  591. // todo:should shuffle here.
  592. random_shuffle(m_pDownloader->m_vRequests.begin(), m_pDownloader->m_vRequests.end());
  593. // if the have index is in requrements, then request all the fractions of the have piece.
  594. for (i=0; i<m_pDownloader->m_vRequests.size(); i++)
  595. {
  596. CRequestsItem& item = m_pDownloader->m_vRequests[i];
  597. if (m_vHave[item.m_index])
  598. send_request_end(item.m_index, item.m_begin, item.m_length);
  599. }
  600. // if download completed, and peer also have all the pieces, then close the connection.
  601. if (m_pDownloader->m_vRequests.size() <= 0 && m_lHave >= m_vHave.size())
  602. m_pConnection->Close();
  603. // ShowMessage(m_pConnection->m_pEConnection, "got_have_bitfield_end()");
  604. m_pDownloaderFeedback->ShowSocketMessage(m_lAddr, m_sPort, "got_have_bitfield_end()");
  605. }
  606. void CSingleDownload::SendCancel(long index, long begin, long length, CSingleDownload* pOwner)
  607. {
  608. for (int i=0; i<m_vActiveRequests.size(); i++)
  609. {
  610. CRequestsItem& item = m_vActiveRequests[i];
  611. if (item.m_index == index && 
  612. item.m_begin == begin && 
  613. item.m_length == length)
  614. {
  615. m_vActiveRequests.erase(m_vActiveRequests.begin() + i);
  616. break;
  617. }
  618. }
  619. if (!is_choked() && m_vHave[index] && pOwner!= this)
  620. m_pConnection->send_cancel(index, begin, length);
  621. }