summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BtInteractive.h2
-rw-r--r--src/DefaultBtInteractive.cc15
-rw-r--r--src/DefaultBtInteractive.h6
-rw-r--r--src/PeerAbstractCommand.cc5
-rw-r--r--src/PeerAbstractCommand.h1
-rw-r--r--src/PeerInteractionCommand.cc33
6 files changed, 46 insertions, 16 deletions
diff --git a/src/BtInteractive.h b/src/BtInteractive.h
index abffb98e..cb97a0c4 100644
--- a/src/BtInteractive.h
+++ b/src/BtInteractive.h
@@ -63,6 +63,8 @@ public:
virtual int32_t countPendingMessage() = 0;
virtual bool isSendingMessageInProgress() = 0;
+
+ virtual size_t countReceivedMessageInIteration() const = 0;
};
typedef SharedHandle<BtInteractive> BtInteractiveHandle;
diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc
index eb93ecfc..f1b2a695 100644
--- a/src/DefaultBtInteractive.cc
+++ b/src/DefaultBtInteractive.cc
@@ -75,7 +75,8 @@ DefaultBtInteractive::DefaultBtInteractive(const SharedHandle<BtContext>& btCont
keepAliveInterval(120),
maxDownloadSpeedLimit(0),
_utPexEnabled(false),
- _dhtEnabled(false)
+ _dhtEnabled(false),
+ _numReceivedMessage(0)
{}
DefaultBtInteractive::~DefaultBtInteractive() {}
@@ -222,7 +223,8 @@ void DefaultBtInteractive::sendKeepAlive() {
}
}
-void DefaultBtInteractive::receiveMessages() {
+size_t DefaultBtInteractive::receiveMessages() {
+ size_t msgcount = 0;
for(int i = 0; i < 50; i++) {
if(maxDownloadSpeedLimit > 0) {
TransferStat stat = peerStorage->calculateStat();
@@ -234,6 +236,7 @@ void DefaultBtInteractive::receiveMessages() {
if(message.isNull()) {
break;
}
+ ++msgcount;
logger->info(MSG_RECEIVE_PEER_MESSAGE, cuid,
peer->ipaddr.c_str(), peer->port,
message->toString().c_str());
@@ -259,6 +262,7 @@ void DefaultBtInteractive::receiveMessages() {
break;
}
}
+ return msgcount;
}
void DefaultBtInteractive::decideInterest() {
@@ -415,7 +419,7 @@ void DefaultBtInteractive::doInteractionProcessing() {
sendKeepAlive();
- receiveMessages();
+ _numReceivedMessage = receiveMessages();
btRequestFactory->removeCompletedPiece();
@@ -446,6 +450,11 @@ bool DefaultBtInteractive::isSendingMessageInProgress()
return dispatcher->isSendingInProgress();
}
+size_t DefaultBtInteractive::countReceivedMessageInIteration() const
+{
+ return _numReceivedMessage;
+}
+
void DefaultBtInteractive::setPeer(const SharedHandle<Peer>& peer)
{
this->peer = peer;
diff --git a/src/DefaultBtInteractive.h b/src/DefaultBtInteractive.h
index 6b4d6670..a70ae31f 100644
--- a/src/DefaultBtInteractive.h
+++ b/src/DefaultBtInteractive.h
@@ -110,6 +110,8 @@ private:
bool _utPexEnabled;
bool _dhtEnabled;
+ size_t _numReceivedMessage;
+
static const int32_t FLOODING_CHECK_INTERVAL = 5;
void addBitfieldMessageToQueue();
@@ -146,12 +148,14 @@ public:
virtual void sendPendingMessage();
- void receiveMessages();
+ size_t receiveMessages();
virtual int32_t countPendingMessage();
virtual bool isSendingMessageInProgress();
+ virtual size_t countReceivedMessageInIteration() const;
+
void setCuid(int32_t cuid) {
this->cuid = cuid;
}
diff --git a/src/PeerAbstractCommand.cc b/src/PeerAbstractCommand.cc
index c46e5d34..42fb8e9c 100644
--- a/src/PeerAbstractCommand.cc
+++ b/src/PeerAbstractCommand.cc
@@ -174,4 +174,9 @@ void PeerAbstractCommand::setNoCheck(bool check) {
this->noCheck = check;
}
+void PeerAbstractCommand::updateKeepAlive()
+{
+ checkPoint.reset();
+}
+
} // namespace aria2
diff --git a/src/PeerAbstractCommand.h b/src/PeerAbstractCommand.h
index 381c4223..e75fd954 100644
--- a/src/PeerAbstractCommand.h
+++ b/src/PeerAbstractCommand.h
@@ -68,6 +68,7 @@ protected:
void setUploadLimit(int32_t uploadLimit);
void setUploadLimitCheck(bool check);
void setNoCheck(bool check);
+ void updateKeepAlive();
private:
bool checkSocketIsReadable;
bool checkSocketIsWritable;
diff --git a/src/PeerInteractionCommand.cc b/src/PeerInteractionCommand.cc
index 160ad5e6..87e6bf52 100644
--- a/src/PeerInteractionCommand.cc
+++ b/src/PeerInteractionCommand.cc
@@ -174,17 +174,15 @@ PeerInteractionCommand::~PeerInteractionCommand() {
}
bool PeerInteractionCommand::executeInternal() {
- setReadCheckSocket(socket);
- disableWriteCheckSocket();
setUploadLimitCheck(false);
setNoCheck(false);
switch(sequence) {
case INITIATOR_SEND_HANDSHAKE:
if(!socket->isWritable(0)) {
- disableReadCheckSocket();
- setWriteCheckSocket(socket);
break;
}
+ disableWriteCheckSocket();
+ setReadCheckSocket(socket);
socket->setBlockingMode();
setTimeout(e->option->getAsInt(PREF_BT_TIMEOUT));
btInteractive->initiateHandshake();
@@ -216,19 +214,30 @@ bool PeerInteractionCommand::executeInternal() {
}
case WIRED:
btInteractive->doInteractionProcessing();
-
+ if(btInteractive->countReceivedMessageInIteration() > 0) {
+ updateKeepAlive();
+ }
+ if(peer->amInterested && !peer->peerChoking ||
+ peer->peerInterested && !peer->amChoking) {
+ if(maxDownloadSpeedLimit > 0) {
+ TransferStat stat = peerStorage->calculateStat();
+ if(maxDownloadSpeedLimit < stat.downloadSpeed) {
+ disableReadCheckSocket();
+ setNoCheck(true);
+ } else {
+ setReadCheckSocket(socket);
+ }
+ } else {
+ setReadCheckSocket(socket);
+ }
+ } else {
+ disableReadCheckSocket();
+ }
break;
}
if(btInteractive->countPendingMessage() > 0) {
setNoCheck(true);
}
- if(maxDownloadSpeedLimit > 0) {
- TransferStat stat = peerStorage->calculateStat();
- if(maxDownloadSpeedLimit < stat.downloadSpeed) {
- disableReadCheckSocket();
- setNoCheck(true);
- }
- }
e->commands.push_back(this);
return false;
}