⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctcs.cpp

📁 最新的enhanced ctorrent源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    snprintf(message, CTCS_BUFSIZE, "CTCONFIG %d %d %f %d %d %d %d %d",      (int)arg_verbose, (int)cfg_seed_hours, cfg_seed_ratio,      (int)cfg_max_peers, (int)cfg_min_peers, (int)arg_file_to_download,      (int)cfg_cache_size, WORLD.IsPaused());  return SendMessage(message);}int Ctcs::Set_Config(char *msgbuf){  if(msgbuf[9] != '.'){    int arg = atoi(msgbuf+9);    if( arg_verbose && !arg ) CONSOLE.Debug("Verbose output off");    arg_verbose = arg;  }  if(msgbuf[11] != '.') cfg_seed_hours = atoi(msgbuf+11);  msgbuf = strchr(msgbuf+11, ' ') + 1;  if(msgbuf[0] != '.') cfg_seed_ratio = atof(msgbuf);  msgbuf = strchr(msgbuf, ' ') + 1;  if(msgbuf[0] != '.') cfg_max_peers = atoi(msgbuf);  msgbuf = strchr(msgbuf, ' ') + 1;  if(msgbuf[0] != '.') cfg_min_peers = atoi(msgbuf);  msgbuf = strchr(msgbuf, ' ') + 1;  if(msgbuf[0] != '.'){    size_t foo = atoi(msgbuf);    if(foo != arg_file_to_download){      arg_file_to_download = foo;      BTCONTENT.SetFilter();    }  }  if( m_protocol >= 2 ){    msgbuf = strchr(msgbuf, ' ') + 1;    if(msgbuf[0] != '.'){      cfg_cache_size = atoi(msgbuf);      BTCONTENT.CacheConfigure();    }  }  if( m_protocol == 1 ){    msgbuf = strchr(msgbuf, ' ') + 1;    // old cfg_exit_zero_peers option  }  msgbuf = strchr(msgbuf, ' ') + 1;  if(msgbuf[0] != '.'){    if(atoi(msgbuf)){      if( !WORLD.IsPaused() ) WORLD.Pause();    }else if( WORLD.IsPaused() ) WORLD.Resume();  }  return 0;}int Ctcs::Send_Detail(){  char message[CTCS_BUFSIZE];  int r=0;  size_t n=0;  BTFILE *file=0;  BitField tmpFilter, availbf;  snprintf( message, CTCS_BUFSIZE, "CTDETAIL %lld %d %ld %ld",    BTCONTENT.GetTotalFilesLength(),    (int)(BTCONTENT.GetPieceLength()), (long)now,    (long)(BTCONTENT.GetSeedTime()) );  r = SendMessage(message);  if(r==0) r = SendMessage("CTFILES");  WORLD.Pieces_I_Can_Get(&availbf);  while( r==0 && (file = BTCONTENT.GetNextFile(file)) ){    ++n;    BTCONTENT.SetTmpFilter(n, &tmpFilter);    BitField tmpBitField = *BTCONTENT.pBF;    tmpBitField.Except(tmpFilter);    BitField tmpavail = availbf;    tmpavail.Except(tmpFilter);    if( m_protocol == 1 )      snprintf( message, CTCS_BUFSIZE, "CTFILE %d %d %d %llu %s",        (int)n, (int)(BTCONTENT.getFilePieces(n)),        (int)(tmpBitField.Count()),        (unsigned long long)(file->bf_length), file->bf_filename );    else      snprintf( message, CTCS_BUFSIZE, "CTFILE %d %d %d %d %llu %s",        (int)n, (int)(BTCONTENT.getFilePieces(n)),        (int)(tmpBitField.Count()), (int)(tmpavail.Count()),        (unsigned long long)(file->bf_length), file->bf_filename );    r = SendMessage(message);  }  if(r==0) r = SendMessage("CTFDONE");  return r;}int Ctcs::Send_Peers(){  btPeer *peer=0;  char message[CTCS_BUFSIZE];  char txtid[PEER_ID_LEN*2+3];  struct sockaddr_in psin;  int r=0;  r=SendMessage("CTPEERS");  while( r==0 && (peer = WORLD.GetNextPeer(peer)) ){    TextPeerID(peer->id, txtid);     peer->GetAddress(&psin);     snprintf(message, CTCS_BUFSIZE, "CTPEER %s %s %c%c%c%c %d %d %llu %llu %d",       txtid, inet_ntoa(psin.sin_addr),       peer->Is_Remote_UnChoked() ? 'U' : 'C',       peer->Is_Local_Interested() ? 'i' : 'n',       peer->Is_Local_UnChoked() ? 'U' : 'C',       peer->Is_Remote_Interested() ? 'i' : 'n',       (int)(peer->RateDL()), (int)(peer->RateUL()),       (unsigned long long)(peer->TotalDL()),         (unsigned long long)(peer->TotalUL()),       (int)(peer->bitfield.Count()) );     r = SendMessage(message);  }  if(r==0) r = SendMessage("CTPDONE");  return r;}int Ctcs::Send_Info(int sev, const char *info){  char message[CTCS_BUFSIZE];  snprintf(message, CTCS_BUFSIZE, "CTINFO %d %s", sev, info);  return SendMessage(message);}int Ctcs::Initial(){  char *s;  strncpy(m_host, arg_ctcs, MAXHOSTNAMELEN-1);  m_host[MAXHOSTNAMELEN-1] = '\0';  if( s = strchr(m_host, ':') ) *s='\0';  m_port = atoi(s=(strchr(arg_ctcs, ':')+1));  if(strchr(s, ':')){    CONSOLE.Input("Enter CTCS password: ", m_pass, CTCS_PASS_SIZE);  } else *m_pass = '\0';  return 0;}int Ctcs::Connect(){  ssize_t r;  m_last_timestamp = now;  if(_s2sin(m_host,m_port,&m_sin) < 0) {    CONSOLE.Warning(2, "warn, get CTCS ip address failed.");    return -1;  }  m_sock = socket(AF_INET,SOCK_STREAM,0);  if(INVALID_SOCKET == m_sock) return -1;  if(setfd_nonblock(m_sock) < 0) {CLOSE_SOCKET(m_sock); return -1; }  r = connect_nonb(m_sock,(struct sockaddr*)&m_sin);  if( r == -1 ){ CLOSE_SOCKET(m_sock); return -1;}  else if( r == -2 ) m_status = T_CONNECTING;  else{    m_status = T_READY;    if( Send_Protocol() != 0 && errno != EINPROGRESS ){      CONSOLE.Warning(2, "warn, send protocol to CTCS failed:  %s",        strerror(errno));      return -1;    }    if( Send_Auth() != 0 && errno != EINPROGRESS ) {      CONSOLE.Warning(2, "warn, send password to CTCS failed:  %s",        strerror(errno));      return -1;    }    if( Send_Torrent(BTCONTENT.GetPeerId(), arg_metainfo_file) != 0 &&        errno != EINPROGRESS ){      CONSOLE.Warning(2, "warn, send torrent to CTCS failed:  %s",        strerror(errno));      return -1;    }  }  return 0;}int Ctcs::IntervalCheck(fd_set *rfdp, fd_set *wfdp){  if( T_FREE == m_status ){    if( now - m_last_timestamp >= m_interval ){      if(Connect() < 0){ Reset(15); return -1; }      FD_SET(m_sock, rfdp);      if( m_status == T_CONNECTING ) FD_SET(m_sock, wfdp);    }else if( now < m_last_timestamp ) m_last_timestamp = now;  }else{    if( m_status == T_CONNECTING ){      FD_SET(m_sock, rfdp);      FD_SET(m_sock, wfdp);    }else if (INVALID_SOCKET != m_sock){      if( now > m_statustime ){        Report_Status(          WORLD.GetSeedsCount(),          WORLD.GetPeersCount() - WORLD.GetSeedsCount() - WORLD.GetConnCount(),          BTCONTENT.pBF->Count(), BTCONTENT.GetNPieces(),          Self.RateDL(), Self.RateUL(),          Self.TotalDL(), Self.TotalUL(),          cfg_max_bandwidth_down, cfg_max_bandwidth_up,          BTCONTENT.CacheUsed()/1024 );        m_statustime = now;      }      FD_SET(m_sock, rfdp);      if( out_buffer.Count() ) FD_SET(m_sock, wfdp);    }  }  return m_sock;}int Ctcs::SocketReady(fd_set *rfdp, fd_set *wfdp, int *nfds,  fd_set *rfdnextp, fd_set *wfdnextp){  if( T_FREE == m_status ) return 0;  if( T_CONNECTING == m_status && FD_ISSET(m_sock,wfdp) ){    int error = 0;    socklen_t n = sizeof(error);    (*nfds)--;    FD_CLR(m_sock, wfdnextp);    if( FD_ISSET(m_sock, rfdp) ){      (*nfds)--;      FD_CLR(m_sock, rfdnextp);    }    if(getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n) < 0 ||       error != 0 ){      if( ECONNREFUSED != error )        CONSOLE.Warning(2, "warn, connect to CTCS failed:  %s",          strerror(error));      Reset(15);      return -1;    }else{      m_status = T_READY;       if( Send_Protocol() != 0 && errno != EINPROGRESS ){        CONSOLE.Warning(2, "warn, send protocol to CTCS failed:  %s",          strerror(errno));        return -1;      }      if( Send_Auth() != 0 && errno != EINPROGRESS ) {        CONSOLE.Warning(2, "warn, send password to CTCS failed:  %s",          strerror(errno));        return -1;      }      if( Send_Torrent(BTCONTENT.GetPeerId(), arg_metainfo_file) == 0          && errno != EINPROGRESS ){        CONSOLE.Warning(2, "warn, send torrent to CTCS failed:  %s",          strerror(errno));        return -1;      }    }  }else if( T_CONNECTING == m_status && FD_ISSET(m_sock,rfdp) ){    int error = 0;    socklen_t n = sizeof(error);    (*nfds)--;    FD_CLR(m_sock, rfdnextp);    getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n);    CONSOLE.Warning(2, "warn, connect to CTCS failed:  %s", strerror(error));    Reset(15);    return -1;  }else if( INVALID_SOCKET != m_sock ){    if( FD_ISSET(m_sock, rfdp) ){      (*nfds)--;      FD_CLR(m_sock,rfdnextp);      CheckMessage();    }    if( INVALID_SOCKET != m_sock && FD_ISSET(m_sock, wfdp) ){      (*nfds)--;      FD_CLR(m_sock,wfdnextp);      if( out_buffer.Count() && out_buffer.FlushOut(m_sock) < 0){        Reset(5);        return -1;      }    }  }  return 0;}void Ctcs::RestartTracker(){  Tracker.SetPause();  // prevents downloader from exiting  Tracker.SetStoped(); // finish the tracker  // Now we need to wait until the tracker updates (T_FINISHED == m_status),  // then Tracker.Resume().  Tracker.SetRestart();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -