/* */ #ifndef _D_PEER_CONNECTION_H_ #define _D_PEER_CONNECTION_H_ #include "Option.h" #include "Socket.h" #include "Logger.h" #include "TorrentMan.h" #include "PeerMessage.h" #include "HandshakeMessage.h" // we assume maximum length of incoming message is "piece" message with 16KB // data. Messages beyond that size are dropped. #define MAX_PAYLOAD_LEN (9+16*1024) class PeerConnection { private: int cuid; const Socket* socket; const Option* option; const Logger* logger; Peer* peer; TorrentMan* torrentMan; char resbuf[MAX_PAYLOAD_LEN]; int resbufLength; int currentPayloadLength; char lenbuf[4]; int lenbufLength; void createNLengthMessage(char* msg, int msgLen, int payloadLen, int id) const; void setIntParam(char* dest, int param) const; void writeOutgoingMessageLog(const char* msg) const; void writeOutgoingMessageLog(const char* msg, int index) const; void writeOutgoingMessageLog(const char* msg, const unsigned char* bitfield, int bitfieldLength) const; void writeOutgoingMessageLog(const char* msg, int index, int begin, int length) const; public: PeerConnection(int cuid, const Socket* socket, const Option* op, Peer* peer, TorrentMan* torrenMan); ~PeerConnection(); void sendHandshake() const; void sendKeepAlive() const; void sendChoke() const; void sendUnchoke() const; void sendInterested() const; void sendNotInterested() const; void sendHave(int index) const; void sendBitfield() const; void sendRequest(int index, int begin, int length) const; void sendPiece(int index, int begin, int length) const; void sendPieceHeader(int index, int begin, int length) const; int sendPieceData(long long int offset, int length) const; void sendCancel(int index, int begin, int length) const; PeerMessage* receiveMessage(); HandshakeMessage* receiveHandshake(); Peer* getPeer() const { return peer; } }; #endif // _D_PEER_CONNECTION_H_