ctorrent_ipv6/peer.h

143 lines
3.3 KiB
C++

#ifndef PEER_H
#define PEER_H
#include "./def.h"
#ifdef WINDOWS
#include <Winsock2.h>
#else
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#endif
#include <time.h>
#include "btrequest.h"
#include "btstream.h"
#include "bitfield.h"
#include "rate.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 // failed
typedef 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;
class btBasic
{
private:
Rate rate_dl;
Rate rate_ul;
public:
struct sockaddr_in6 m_sin;
//IP地址相关函数
int IpEquiv(struct sockaddr_in6 addr);
void SetIp(struct sockaddr_in6 addr);
void SetAddress(struct sockaddr_in6 addr);
void GetAddress(struct sockaddr_in6 *psin) const {
memcpy(psin,&m_sin,sizeof(struct sockaddr_in6));
}
// 速率相关函数
Rate GetDLRate() const { return rate_dl; }
Rate GetULRate() const { return rate_ul; }
u_int64_t TotalDL() const { return rate_dl.Count(); }
u_int64_t TotalUL() const { return rate_ul.Count(); }
void DataRecved(size_t nby) { rate_dl.CountAdd(nby); }
void DataSended(size_t nby) { rate_ul.CountAdd(nby); }
size_t RateDL() const { return rate_dl.RateMeasure(); }
size_t RateUL() const { 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(); }
};
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_reserved:3;
BTSTATUS m_state;
size_t m_cached_idx;
size_t m_err_count;
int PieceDeliver(size_t mlen);
int ReportComplete(size_t idx);
int RequestCheck();
int SendRequest();
int CancelRequest(PSLICE ps);
int ReponseSlice();
int RequestPiece();
int MsgDeliver();
int CouldReponseSlice();
int BandWidthLimit();
public:
BitField bitfield;
btStream stream;
RequestQueue request_q;
RequestQueue reponse_q;
btPeer();
int RecvModule();
int SendModule();
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);
void SetStatus(unsigned char s){ m_status = s; }
unsigned char GetStatus() const { return m_status; }
int NeedWrite();
void CloseConnection();
int AreYouOK();
int Send_ShakeInfo();
int HandShake();
int Need_Remote_Data();
int Need_Local_Data();
void dump();
};
extern btBasic Self;
#endif