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

📄 peer.h

📁 最新的enhanced ctorrent源码
💻 H
字号:
#ifndef PEER_H#define PEER_H#include "./def.h"#ifdef WINDOWS#include <Winsock2.h>#else#include <unistd.h>#include <stdio.h>   // autoconf manual: Darwin + others prereq for stdlib.h#include <stdlib.h>  // autoconf manual: Darwin prereq for sys/socket.h#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#endif#include <inttypes.h>#include <time.h>#include <string.h>#include "btrequest.h"#include "btstream.h"#include "bitfield.h"#include "rate.h"#include "btconfig.h"#define P_CONNECTING (unsigned char) 0		// connecting#define P_HANDSHAKE  (unsigned char) 1		// handshaking#define P_SUCCESS (unsigned char) 2		// successful#define P_FAILED (unsigned char) 3		// failedtypedef struct _btstatus{  unsigned char remote_choked:1;  unsigned char remote_interested:1;  unsigned char local_choked:1;  unsigned char local_interested:1;  unsigned char reserved:4;		/* unused */}BTSTATUS;int TextPeerID(unsigned char *peerid, char *txtid);class btBasic{protected:  Rate rate_dl;  Rate rate_ul;private:  struct sockaddr_in m_sin;public:  //IP地址相关函数  int IpEquiv(struct sockaddr_in addr);  void SetIp(struct sockaddr_in addr);  void SetAddress(struct sockaddr_in addr);  void GetAddress(struct sockaddr_in *psin) const {    memcpy(psin,&m_sin,sizeof(struct sockaddr_in));  }  // 速率相关函数  const Rate &GetDLRate() const { return rate_dl; }  const Rate &GetULRate() const { return rate_ul; }  void SetDLRate(Rate rate) { rate_dl = rate; StopDLTimer(); }  void SetULRate(Rate rate) { rate_ul = rate; StopULTimer(); }    uint64_t TotalDL() const { return rate_dl.Count(); }  uint64_t TotalUL() const { return rate_ul.Count(); }  void DataRecved(size_t nby) { rate_dl.CountAdd(nby); }  void DataSended(size_t nby, double timestamp) { rate_ul.CountAdd(nby);    rate_ul.RateAdd(nby, (size_t)cfg_max_bandwidth_up, timestamp); }  size_t CurrentDL() { return rate_dl.CurrentRate(); }  size_t CurrentUL() { return rate_ul.CurrentRate(); }  size_t RateDL() { return rate_dl.RateMeasure(); }  size_t RateUL() { return rate_ul.RateMeasure(); }  void StartDLTimer() { rate_dl.StartTimer(); }  void StartULTimer() { rate_ul.StartTimer(); }  void StopDLTimer() { rate_dl.StopTimer(); }  void StopULTimer() { rate_ul.StopTimer(); }  void ResetDLTimer() { rate_dl.Reset(); }  void ResetULTimer() { rate_ul.Reset(); }  double LastSendTime() const { return rate_ul.LastRealtime(); }  double LastRecvTime() const { return rate_dl.LastRealtime(); }  size_t LastSizeSent() const { return rate_ul.LastSize(); }  size_t LastSizeRecv() const { return rate_dl.LastSize(); }  Rate *DLRatePtr() { return &rate_dl; }  Rate *ULRatePtr() { return &rate_ul; }  double LateDL() const { return rate_dl.Late(); }  double LateUL() const { return rate_ul.Late(); }  int OntimeDL() const { return rate_dl.Ontime(); }  int OntimeUL() const { return rate_ul.Ontime(); }  void OntimeDL(int yn) { rate_dl.Ontime(yn); }  void OntimeUL(int yn) { rate_ul.Ontime(yn); }};class btPeer:public btBasic{ private:  time_t m_last_timestamp, m_unchoke_timestamp;  unsigned char m_f_keepalive:1;  unsigned char m_status:4;  unsigned char m_bad_health:1;  unsigned char m_standby:1;  unsigned char m_want_again:1;  // attempt reconnect if lost  unsigned char m_connect:1;     // we initiated the connection  unsigned char m_retried:1;     // already retried connecting  unsigned char m_connect_seed:1; // connected while I am seed  unsigned char m_requested:1;   // received a request since unchoke  unsigned char m_reserved:4;  BTSTATUS m_state;  size_t m_cached_idx;  size_t m_err_count;  size_t m_req_send;  // target number of outstanding requests  size_t m_req_out;   // actual number of outstanding requests  size_t m_latency;  size_t m_prev_dlrate;  time_t m_latency_timestamp;  time_t m_health_time, m_receive_time, m_next_send_time;  char m_lastmsg;  time_t m_choketime;  time_t m_prefetch_time;  time_t m_cancel_time;  static btPeer *g_next_up, *g_next_dn;  static unsigned char g_defer_up;    int PieceDeliver(size_t mlen);  int ReportComplete(size_t idx);  int RequestCheck();  int SendRequest();  int CancelPiece();  int CancelRequest(PSLICE ps);  int ReponseSlice();  int RequestPiece();  int MsgDeliver();  int CouldReponseSlice();  int RequestSlice(size_t idx,size_t off,size_t len); public:  unsigned char id[PEER_ID_LEN];  BitField bitfield;  btStream stream;  RequestQueue request_q;  RequestQueue reponse_q;  btPeer();  void CopyStats(btPeer *peer);  int RecvModule();  int SendModule();  int HealthCheck();  int CheckSendStatus();  time_t SetLastTimestamp() { return time(&m_last_timestamp); }  time_t GetLastTimestamp() const { return m_last_timestamp; }  time_t SetLastUnchokeTime() { return time(&m_unchoke_timestamp); }  time_t GetLastUnchokeTime() const { return m_unchoke_timestamp; }  int Is_Remote_Interested() const { return m_state.remote_interested ? 1 : 0; }  int Is_Remote_UnChoked() const { return m_state.remote_choked ? 0 : 1; }  int Is_Local_Interested() const { return m_state.local_interested ? 1 : 0;}  int Is_Local_UnChoked() const { return m_state.local_choked ? 0 : 1; }  int SetLocal(unsigned char s);  int IsEmpty() const;  int CancelSliceRequest(size_t idx, size_t off, size_t len);  int CancelPiece(size_t idx);    void SetStatus(unsigned char s){ m_status = s; }  unsigned char GetStatus() const { return m_status; }  int NeedWrite();  int NeedRead();    void CloseConnection();  int CanReconnect() const { return (m_connect && m_want_again && !m_retried) ? 1 : 0; }  int WantAgain() const { return m_want_again ? 1 : 0; }  void DontWantAgain() { m_want_again = 0; }  void SetConnect() { m_connect = 1; }  void Retry() { m_retried = 1; }  int Retried() const { return m_retried ? 1 : 0; }  int ConnectedWhileSeed() const { return m_connect_seed ? 1 : 0; }    int AreYouOK();  int Send_ShakeInfo();  int HandShake();  int Need_Remote_Data() const;  int Need_Local_Data() const;  int PutPending();  void Prefetch(time_t deadline);  void dump();};extern btBasic Self;#endif

⌨️ 快捷键说明

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