亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? peerlist.cpp

?? 在嵌入linux-arm上運行的bt下載應用程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <sys/types.h>#include "peerlist.h"#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include "btconfig.h"#include "connect_nonb.h"#include "setnonblock.h"#include "btcontent.h"#include "msgencode.h"#include "iplist.h"#include "tracker.h"#include "ctcs.h"#include "bttime.h"#define MAX_UNCHOKE 3#define UNCHOKE_INTERVAL 10#define OPT_INTERVAL 30#define KEEPALIVE_INTERVAL 117#define LISTEN_PORT_MAX 2706#define LISTEN_PORT_MIN 2106#define PEER_IS_SUCCESS(peer) (P_SUCCESS == (peer)->GetStatus())#define PEER_IS_FAILED(peer) (P_FAILED == (peer)->GetStatus())#define NEED_MORE_PEERS() (m_peers_count < cfg_max_peers)const char LIVE_CHAR[4] = {'-', '\\','|','/'};PeerList WORLD;PeerList::PeerList(){  m_unchoke_check_timestamp =    m_keepalive_check_timestamp =    m_opt_timestamp = time((time_t*) 0);  m_head = (PEERNODE*) 0;  m_listen_sock = INVALID_SOCKET;  m_peers_count = m_seeds_count = 0;  m_live_idx = 0;}PeerList::~PeerList(){  PEERNODE *p,*pnext;  for(p = m_head; p ; ){    pnext = p->next;    delete p->peer;    delete p;    p = pnext;  }}int PeerList::IsEmpty() const{  return m_peers_count ? 0 : 1;}void PeerList::CloseAll(){  PEERNODE *p;  for(p = m_head; p;){    m_head = p->next;    delete (p->peer);    delete p;    p = m_head;  }}int PeerList::NewPeer(struct sockaddr_in addr, SOCKET sk){  PEERNODE *p;  btPeer *peer = (btPeer*) 0;  int r;  if( m_peers_count >= cfg_max_peers ){    if( INVALID_SOCKET != sk ) CLOSE_SOCKET(sk);    return -4;  }    if( Self.IpEquiv(addr) ){     if(INVALID_SOCKET != sk) CLOSE_SOCKET(sk); return -3;} // myself  for(p = m_head; p; p = p->next){    if(PEER_IS_FAILED(p->peer)) continue;    if( p->peer->IpEquiv(addr)){  // already exist.      if( INVALID_SOCKET != sk) CLOSE_SOCKET(sk);       return -3;    }  }    if( INVALID_SOCKET == sk ){    if( INVALID_SOCKET == (sk = socket(AF_INET,SOCK_STREAM,0)) ) return -1;        if( setfd_nonblock(sk) < 0) goto err;    if(arg_verbose) fprintf(stderr, "Connecting to %s:%hu\n",        inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));    if( -1 == (r = connect_nonb(sk,(struct sockaddr*)&addr)) ) return -1;    peer = new btPeer;#ifndef WINDOWS    if( !peer ) goto err;#endif    peer->SetAddress(addr);    peer->stream.SetSocket(sk);    peer->SetStatus( (-2 == r) ? P_CONNECTING : P_HANDSHAKE );  }else{    if( setfd_nonblock(sk) < 0) goto err;    peer = new btPeer;#ifndef WINDOWS    if( !peer ) goto err;#endif    peer->SetAddress(addr);    peer->stream.SetSocket(sk);    peer->SetStatus(P_HANDSHAKE);  }  if( P_HANDSHAKE == peer->GetStatus() )    if( peer->Send_ShakeInfo() != 0 ) { delete peer; return -1; }  p = new PEERNODE;#ifndef WINDOWS  if( !p ){ delete peer; return -1;}#endif  m_peers_count++;  p->peer = peer;    p->next = m_head;  m_head = p;  return 0; err:  CLOSE_SOCKET(sk);  return -1;}int PeerList::FillFDSET(const time_t *pnow,fd_set *rfdp,fd_set *wfdp){  PEERNODE *p;  PEERNODE *pp = (PEERNODE*) 0;  int f_keepalive_check = 0;  int f_unchoke_check = 0;  int maxfd = -1;  int i = 0;  SOCKET sk = INVALID_SOCKET;  struct sockaddr_in addr;  btPeer * UNCHOKER[MAX_UNCHOKE + 1];    if( !Tracker.IsPaused() && !Tracker.IsQuitting() )    for( ;NEED_MORE_PEERS() && !IPQUEUE.IsEmpty(); ){      if(IPQUEUE.Pop(&addr) < 0) break;      if(NewPeer(addr,INVALID_SOCKET) == -4) break;    }  Self.SetCurrentRates();  // show status line.  if( m_pre_dlrate.TimeUsed(pnow) ){    char partial[30] = "";    char *runtime_msg = new char[256];    char *tmp_msg = runtime_msg;    memset(runtime_msg, 0, 256);    if(arg_file_to_download){      BitField tmpBitField =  *BTCONTENT.pBF;      tmpBitField.Except(*BTCONTENT.pBFilter);      sprintf( partial, "P:%u/%u ",         tmpBitField.Count(),        BTCONTENT.getFilePieces(arg_file_to_download) );    }    sprintf(runtime_msg, "\r                                                                               ");    sprintf(runtime_msg, "\r%c %u/%u/%u [%u/%u/%u] %lluMB,%lluMB | %u,%uK/s | %u,%uK E:%u,%u %s%s ",           LIVE_CHAR[m_live_idx],           m_seeds_count,           m_peers_count - m_seeds_count,           Tracker.GetPeersCount(),           BTCONTENT.pBF->Count(),           BTCONTENT.pBF->NBits(),           Pieces_I_Can_Get(),           Self.TotalDL() >> 20, Self.TotalUL() >> 20,           Self.RateDL() >> 10, Self.RateUL() >> 10,           m_pre_dlrate.RateMeasure(Self.GetDLRate()) >> 10,           m_pre_ulrate.RateMeasure(Self.GetULRate()) >> 10,           Tracker.GetRefuseClick(),           Tracker.GetOkClick(),           partial,           (Tracker.GetStatus()==T_CONNECTING) ? "Connecting" :             ( (Tracker.GetStatus()==T_READY) ? "Connected" :                 (Tracker.IsPaused() ?                  ((Tracker.GetStatus()==T_FINISHED) ? "Paused" : "Pausing") :                  (Tracker.IsQuitting() ? "Quitting" : "")) )    );    if (arg_runtime_status_fd>0) {      write(arg_runtime_status_fd, runtime_msg, 256);      // rewind to offset 0.      lseek(arg_runtime_status_fd, 0, SEEK_SET);      //sprintf(tmp_msg, "%s\n\n", runtime_msg);      //write(arg_runtime_status_fd, tmp_msg, strlen(tmp_msg));    } else {      fprintf(stdout, "%s",runtime_msg);      fflush(stdout);    }    delete []runtime_msg;    m_pre_dlrate = Self.GetDLRate();    m_pre_ulrate = Self.GetULRate();    m_live_idx++;    if(arg_ctcs) CTCS.Report_Status(           m_seeds_count, m_peers_count - m_seeds_count,           BTCONTENT.pBF->Count(), BTCONTENT.pBF->NBits(), Pieces_I_Can_Get(),           Self.RateDL(), Self.RateUL(),           Self.TotalDL(), Self.TotalUL(),           cfg_max_bandwidth_down, cfg_max_bandwidth_up);  }      if(KEEPALIVE_INTERVAL <= (*pnow - m_keepalive_check_timestamp)){    m_keepalive_check_timestamp = *pnow;    f_keepalive_check = 1;  }  if(UNCHOKE_INTERVAL <= (*pnow - m_unchoke_check_timestamp)){        m_unchoke_check_timestamp = *pnow;    f_unchoke_check = 1;      }  if( f_unchoke_check ) {    memset(UNCHOKER, 0, (MAX_UNCHOKE + 1) * sizeof(btPeer*));    if (OPT_INTERVAL <= *pnow - m_opt_timestamp) m_opt_timestamp = 0;  }  m_seeds_count = 0;  for(p = m_head; p;){    if( PEER_IS_FAILED(p->peer)){      if( pp ) pp->next = p->next; else m_head = p->next;      delete p->peer;      delete p;      m_peers_count--;      if( pp ) p = pp->next; else p = m_head;      continue;    }else{      if (p->peer->bitfield.IsFull()) m_seeds_count++;      if( f_keepalive_check ){        if(3 * KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp())){          if(arg_verbose) fprintf(stderr, "close: keepalive expired\n");          p->peer->CloseConnection();          goto skip_continue;        }                if(PEER_IS_SUCCESS(p->peer) &&            KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp()) &&           p->peer->AreYouOK() < 0){          if(arg_verbose) fprintf(stderr, "close: keepalive death\n");          p->peer->CloseConnection();          goto skip_continue;        }      }      if( f_unchoke_check && PEER_IS_SUCCESS(p->peer) ){        if( p->peer->Is_Remote_Interested() && p->peer->Need_Local_Data() )            UnChokeCheck(p->peer, UNCHOKER);        else if(p->peer->SetLocal(M_CHOKE) < 0){          if(arg_verbose) fprintf(stderr, "close: Can't choke peer\n");          p->peer->CloseConnection();          goto skip_continue;        }      }      sk = p->peer->stream.GetSocket();      if(maxfd < sk) maxfd = sk;      if( p->peer->NeedRead() ) FD_SET(sk,rfdp);      if( p->peer->NeedWrite() ) FD_SET(sk,wfdp);    skip_continue:       pp = p;      p = p->next;    }  } // end for    if( INVALID_SOCKET != m_listen_sock && m_peers_count < cfg_max_peers){    FD_SET(m_listen_sock, rfdp);    if( maxfd < m_listen_sock ) maxfd = m_listen_sock;  }  if( f_unchoke_check ){    if(arg_verbose) fprintf(stderr, "\nUnchoker ");    if (!m_opt_timestamp){      if(arg_verbose) fprintf(stderr, "(opt) ");      m_opt_timestamp = *pnow;    }    for( i = 0; i < MAX_UNCHOKE + 1; i++){      if( (btPeer*) 0 == UNCHOKER[i]) break;      if( PEER_IS_FAILED(UNCHOKER[i]) ) continue;      if(arg_verbose){        fprintf(stderr, "D=%lluMB@%uK/s:U=%lluMB ",          UNCHOKER[i]->TotalDL() >> 20, UNCHOKER[i]->RateDL() >> 10,          UNCHOKER[i]->TotalUL() >> 20);        if( UNCHOKER[i]->bitfield.IsEmpty() ) fprintf(stderr, "(empty) ");      }      if( UNCHOKER[i]->SetLocal(M_UNCHOKE) < 0){        if(arg_verbose) fprintf(stderr, "close: Can't unchoke peer\n");        UNCHOKER[i]->CloseConnection();        continue;      }      sk = UNCHOKER[i]->stream.GetSocket();      if(!FD_ISSET(sk,wfdp) && UNCHOKER[i]->NeedWrite()){        FD_SET(sk,wfdp);        if( maxfd < sk) maxfd = sk;      }    } // end for    if(arg_verbose) fprintf(stderr, "\n");  }  Self.ClearCurrentRates();    return maxfd;}btPeer* PeerList::Who_Can_Abandon(btPeer *proposer){  PEERNODE *p;  btPeer *peer = (btPeer*) 0;  for(p = m_head; p; p = p->next){    if(!PEER_IS_SUCCESS(p->peer) || p->peer == proposer ||       p->peer->request_q.IsEmpty() ) continue;    if(proposer->bitfield.IsSet(p->peer->request_q.GetRequestIdx())){      if(!peer){        if( p->peer->RateDL() < proposer->RateDL() ) peer = p->peer;      }else{        if( p->peer->RateDL() < peer->RateDL() ) peer = p->peer;      }    }  }//end for  return peer;}// This takes an index parameter to facilitate modification of the function to// allow targeting of a specific piece.  It's currently only used as a flag to// specify endgame or initial-piece mode though.size_t PeerList::What_Can_Duplicate(BitField &bf, btPeer *proposer, size_t idx){  PEERNODE *p;  btPeer *peer = (btPeer*) 0;  int endgame;  PSLICE ps;  size_t piece, piece1, qsize, mark, bench;  unsigned long rndbits;  int r=0;  endgame = idx < BTCONTENT.GetNPieces();	// else initial-piece mode  if(endgame) mark = 0;  else mark = cfg_req_queue_length;  bench = BTCONTENT.GetNPieces();  // In initial mode, only dup a piece with trade value.  // In endgame mode, dup any if there are no pieces with trade value.  FindValuedPieces(bf, proposer, !endgame);  if( bf.IsEmpty() ){    if(endgame) bf = proposer->bitfield;    else return BTCONTENT.GetNPieces();  }  /* In endgame mode, select from peers with the longest request queue.     In initial mode, select from peers with the shortest non-empty request     queue.  */  for(p = m_head; p; p = p->next){    if( !PEER_IS_SUCCESS(p->peer) || p->peer == proposer ) continue;    if( p->peer->request_q.IsEmpty() ) continue;    piece = BTCONTENT.GetNPieces();    ps = p->peer->request_q.GetHead();    for( ; ps; ps = ps->next){      if( piece == ps->index || bench == ps->index || piece1 == ps->index ||          !bf.IsSet(ps->index) || proposer->request_q.HasIdx(ps->index) )        continue;      piece = ps->index;      qsize = p->peer->request_q.Qlen(piece);      if( (endgame && qsize > mark) ||          (!endgame && (qsize < mark || !peer)) ){        mark = qsize;        peer = p->peer;        piece1 = piece;      }else if( qsize == mark ){        if( !r-- ){          rndbits = random();          r = 30;        }        if( bench != piece && (rndbits>>=1)&01 ){          bench = piece1;          peer = p->peer;          piece1 = piece;        }      }    }  }  return peer ? piece1 : BTCONTENT.GetNPieces();}void PeerList::FindValuedPieces(BitField &bf, btPeer *proposer, int initial){  PEERNODE *p;  BitField bf_all_have = bf, bf_int_have = bf,    bf_others_have, bf_only_he_has = bf, bf_prefer;  for(p = m_head; p; p = p->next){    if( !PEER_IS_SUCCESS(p->peer) || p->peer == proposer ) continue;    if( p->peer->Need_Remote_Data() )      bf_int_have.And(p->peer->bitfield);    bf_all_have.And(p->peer->bitfield);    if( !initial && !p->peer->bitfield.IsFull() )      bf_only_he_has.Except(p->peer->bitfield);    else bf_others_have.Comb(p->peer->bitfield);  }  /* bf_all_have is now pertinent pieces that all peers have     bf_int_have is pertinent pieces that all peers in which I'm interested have     We prefer to get pieces that those peers need, if we can.  Otherwise go     for pieces that any peer needs in hopes of future reciprocation. */  if( !bf_int_have.IsFull() )    bf_all_have = bf_int_have;  bf_all_have.Invert();  bf.And(bf_all_have); // bf is now pertinent pieces that not everyone has  bf_prefer = initial ? bf_others_have : bf_only_he_has;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人a视频| 日韩中文欧美在线| 欧美经典一区二区| 精品捆绑美女sm三区| 欧美一区二区视频网站| 欧美精品亚洲二区| 国产精品视频一区二区三区不卡| 精品美女在线观看| 久久免费视频色| 久久久久久久久岛国免费| 久久综合久久99| 国产午夜精品一区二区三区视频 | 国产婷婷色一区二区三区在线| 日韩欧美的一区二区| 日韩欧美国产综合一区| 亚洲精品一区二区三区在线观看| 精品国产亚洲在线| 国产香蕉久久精品综合网| 欧美激情一区二区| 亚洲视频在线观看一区| 一区二区三区日韩精品| 亚洲电影中文字幕在线观看| 日韩一区精品视频| 国内久久精品视频| 成人av手机在线观看| 色屁屁一区二区| 欧美日韩高清一区二区不卡 | 国产欧美日本一区视频| 国产精品久久影院| 一区二区三区电影在线播| 午夜久久久久久久久久一区二区| 日本va欧美va精品| 国产福利一区在线| 日本高清成人免费播放| 91精品免费观看| 久久久久久久av麻豆果冻| 中文字幕亚洲不卡| 天涯成人国产亚洲精品一区av| 蜜桃一区二区三区在线| 懂色av噜噜一区二区三区av| 日本乱人伦一区| 欧美成人精品3d动漫h| 国产精品欧美一区喷水| 午夜视频在线观看一区二区| 激情欧美日韩一区二区| 一本到高清视频免费精品| 欧美一区午夜视频在线观看| 国产拍欧美日韩视频二区| 亚洲精品成人少妇| 极品少妇xxxx精品少妇偷拍| 99re热这里只有精品视频| 欧美精品在线一区二区三区| 国产女人18水真多18精品一级做| 洋洋av久久久久久久一区| 精品在线观看免费| 色狠狠av一区二区三区| 欧美变态口味重另类| 亚洲免费观看高清| 国产在线一区二区综合免费视频| 色婷婷久久综合| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲免费av网站| 国产精品456| 欧美精品一级二级| 《视频一区视频二区| 精品综合免费视频观看| 欧美亚洲另类激情小说| 国产亚洲一区二区三区在线观看| 午夜伦理一区二区| 99热99精品| 久久免费午夜影院| 奇米色一区二区| 91久久一区二区| 国产精品视频麻豆| 国内外成人在线视频| 欧美精品 日韩| 亚洲综合一区二区三区| 成人高清免费在线播放| 精品国内片67194| 日韩在线观看一区二区| 一本大道久久a久久精二百| 国产视频不卡一区| 精品综合免费视频观看| 欧美一级理论片| 亚洲一区二区在线视频| 99精品久久99久久久久| 国产三级精品视频| 激情欧美一区二区| 精品日韩成人av| 蜜臀av性久久久久av蜜臀妖精| 欧美日韩一区小说| 一区二区三区精品视频在线| 99久久精品免费| 国产精品伦一区| 成人午夜短视频| 国产肉丝袜一区二区| 国产精品影音先锋| 久久综合九色综合欧美亚洲| 麻豆免费精品视频| 日韩一本二本av| 日本美女视频一区二区| 666欧美在线视频| 日韩高清中文字幕一区| 欧美日本国产一区| 日韩中文字幕1| 日韩一区二区在线观看视频| 男人操女人的视频在线观看欧美| 5566中文字幕一区二区电影| 五月综合激情网| 91精品欧美福利在线观看| 日韩电影免费在线看| 欧美一区二区美女| 久久精品国产秦先生| 精品乱码亚洲一区二区不卡| 国产在线日韩欧美| 国产日韩欧美亚洲| 成人精品国产一区二区4080| 国产精品对白交换视频| 91免费观看在线| 亚洲国产欧美一区二区三区丁香婷| 欧美在线色视频| 午夜精品久久久久久久蜜桃app| 欧美嫩在线观看| 伦理电影国产精品| 国产日产欧美一区二区视频| www.日本不卡| 亚洲一区二区免费视频| 8x8x8国产精品| 韩国av一区二区三区四区 | 国产一区二区视频在线| 国产欧美精品一区二区三区四区| 成人丝袜18视频在线观看| 一区二区三区免费在线观看| 在线不卡免费av| 国产呦萝稀缺另类资源| 中文字幕亚洲在| 欧美人与z0zoxxxx视频| 国内精品自线一区二区三区视频| 国产精品污网站| 在线精品视频免费观看| 美女视频黄频大全不卡视频在线播放| 久久亚洲综合色一区二区三区| 成人自拍视频在线观看| 亚洲国产日韩综合久久精品| xf在线a精品一区二区视频网站| 成人手机电影网| 午夜欧美2019年伦理| 久久精品亚洲国产奇米99| 色欧美片视频在线观看在线视频| 视频在线观看国产精品| 日本一区免费视频| 欧美日韩成人一区二区| 福利一区福利二区| 日韩在线a电影| 国产精品传媒在线| 日韩午夜三级在线| www.亚洲人| 久久99热99| 亚洲一二三级电影| 久久久久久久免费视频了| 欧美午夜不卡视频| 国产电影精品久久禁18| 午夜精品久久久久| 中文在线一区二区| 日韩三级视频中文字幕| 一本到高清视频免费精品| 国产乱子轮精品视频| 亚洲成a人片综合在线| 国产精品美女久久久久久2018| 69堂国产成人免费视频| 94-欧美-setu| 国产精品一区二区黑丝| 日韩—二三区免费观看av| 亚洲视频一区在线观看| 久久影院视频免费| 欧美丰满少妇xxxbbb| 91看片淫黄大片一级在线观看| 韩国欧美一区二区| 日韩在线一区二区| 一区二区三区国产| 中文字幕在线不卡一区| 久久奇米777| 日韩欧美色综合网站| 欧美日韩三级一区| 色婷婷国产精品| 99久久久无码国产精品| 国产乱人伦偷精品视频不卡| 日本视频中文字幕一区二区三区| 国产精品高潮久久久久无| 久久品道一品道久久精品| 日韩精品一区二区在线观看| 91精品国产综合久久久久久久 | 国产在线精品一区二区不卡了| 亚洲va在线va天堂| 夜夜嗨av一区二区三区中文字幕| 国产精品麻豆一区二区| 国产日韩欧美一区二区三区乱码 | 99久久久精品| 成人免费看视频| 国产91精品一区二区麻豆亚洲|