diff --git a/ChangeLog b/ChangeLog index 493b6d04..ff03353e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-01-31 Tatsuhiro Tsujikawa + + Choose port for BitTorrent/DHT randomly from the specified range. + * src/DHTConnectionImpl.cc + * src/PeerListenCommand.cc + 2009-01-31 Tatsuhiro Tsujikawa Send HTTP Authorization header only if it is requested by the diff --git a/src/DHTConnectionImpl.cc b/src/DHTConnectionImpl.cc index aa7638f8..35ff0f37 100644 --- a/src/DHTConnectionImpl.cc +++ b/src/DHTConnectionImpl.cc @@ -35,12 +35,15 @@ #include "DHTConnectionImpl.h" #include +#include +#include #include "LogFactory.h" #include "Logger.h" #include "RecoverableException.h" #include "Util.h" #include "Socket.h" +#include "SimpleRandomizer.h" namespace aria2 { @@ -51,12 +54,16 @@ DHTConnectionImpl::~DHTConnectionImpl() {} bool DHTConnectionImpl::bind(uint16_t& port, IntSequence& ports) { - while(ports.hasNext()) { - int sport = ports.next(); - if(!(0 < sport && 0 <= UINT16_MAX)) { + std::deque randPorts = ports.flush(); + std::random_shuffle(randPorts.begin(), randPorts.end(), + *SimpleRandomizer::getInstance().get()); + + for(std::deque::const_iterator portItr = randPorts.begin(); + portItr != randPorts.end(); ++portItr) { + if(!(0 < (*portItr) && (*portItr) <= UINT16_MAX)) { continue; } - port = sport; + port = (*portItr); if(bind(port)) { return true; } diff --git a/src/PeerListenCommand.cc b/src/PeerListenCommand.cc index b94d4258..04a3bfaa 100644 --- a/src/PeerListenCommand.cc +++ b/src/PeerListenCommand.cc @@ -35,6 +35,8 @@ #include "PeerListenCommand.h" #include +#include +#include #include "DownloadEngine.h" #include "Peer.h" @@ -44,6 +46,7 @@ #include "ReceiverMSEHandshakeCommand.h" #include "Logger.h" #include "Socket.h" +#include "SimpleRandomizer.h" namespace aria2 { @@ -67,12 +70,17 @@ PeerListenCommand::~PeerListenCommand() bool PeerListenCommand::bindPort(uint16_t& port, IntSequence& seq) { socket.reset(new SocketCore()); - while(seq.hasNext()) { - int sport = seq.next(); - if(!(0 < sport && sport <= UINT16_MAX)) { + + std::deque randPorts = seq.flush(); + std::random_shuffle(randPorts.begin(), randPorts.end(), + *SimpleRandomizer::getInstance().get()); + + for(std::deque::const_iterator portItr = randPorts.begin(); + portItr != randPorts.end(); ++portItr) { + if(!(0 < (*portItr) && (*portItr) <= UINT16_MAX)) { continue; } - port = sport; + port = (*portItr); try { socket->bind(port); socket->beginListen();