/* */ #ifndef _D_PEER_INTERACTION_COMMAND_H_ #define _D_PEER_INTERACTION_COMMAND_H_ #include "PeerAbstractCommand.h" #include "PeerConnection.h" #include "PeerInteraction.h" #include "TimeA2.h" using namespace std; #define MAX_PEER_CHOKING_INTERVAL (1*60) #define KEEP_ALIVE_INTERVAL 120 class PeerInteractionCommand : public PeerAbstractCommand { private: int sequence; PeerInteraction* peerInteraction; Time keepAliveCheckPoint; //Time chokeCheckPoint; Time freqCheckPoint; Time haveCheckTime; Time periodicExecPoint; int chokeUnchokeCount; int haveCount; int keepAliveCount; void receiveMessages(); void detectMessageFlooding(); void checkLongTimePeerChoking(); void detectTimeoutAndDuplicateBlock(); void decideChoking(); void sendKeepAlive(); void checkHave(); protected: bool executeInternal(); bool prepareForRetry(int wait); bool prepareForNextPeer(int wait); void onAbort(Exception* ex); public: PeerInteractionCommand(int cuid, const PeerHandle& peer, TorrentDownloadEngine* e, const SocketHandle& s, int sequence); ~PeerInteractionCommand(); enum Seq { INITIATOR_SEND_HANDSHAKE, INITIATOR_WAIT_HANDSHAKE, RECEIVER_SEND_HANDSHAKE, RECEIVER_WAIT_HANDSHAKE, WIRED}; }; #endif // _D_PEER_INTERACTION_COMMAND_H_